Skip to main content

Full text of "Intel URDA SDK-86 System Design Kernel Monitor Listings"

See other formats







JRA 


SDK-86 
~ SYSTEM DESIGN KERNEL 





MONITOR LISTINGS 





Additional copies of this manual may Бе purchased from: 


URDA, Inc. 
4516 Henry Street, Suite 407 
Pittsburgn, PA 15213 


URDA retains the right to change the specifications at any time, without notice. 
This product is manufactured by URDA, Inc. under license from Intel Corportation 


Neither URDA or Intel makes any warranty of any kind with regard to this matenal, including, but not 
limited to, the implied warranties of merchantability and fitness for a particular purpose. Neither 
URDA, Inc. or Intel Corporation assumes any responsibility for any errors that may appear in this 
document. Neither URDA, Inc. or Intel Corporation makes any commitment to update or to keep 
current the information contained in this document. 


Neither URDA, Inc. or Intel Corporation assumes any responsibility for the use of any circuitry 
other than circuitry embodied in this product. No other patent licenses are implied. 


Intel software products are copyrighted by and shall remain the property of Intel Corporation. Use, 
duplication or disclosure is subject to restrictions stated in Intel's software license, or as defined in 
ASPR 7-104.9(a)(9). 


No part of this document may be copied or reproduced in any form or by any means without the 
prior written consent of Intel Corporation. 


The following is a trademark of Intel Corporation and its affiliates and may only be used to identify 
products: MCS. 


РВЕЕАСЕ 





This manual contains (ће source listing Гог version 1.1 of both the Кеурад апа serial 
monitor programs. Two listings are provided for each monitor program; a PL/M-86 
source listing and an expanded source listing containing the assembly language 
equivalent of each PL/M instruction. 





| SDK-86 KEYPAD MONITOR 
ay PL/M-86 SOURCE LISTING 
g | 


РЬ/М-86 COMPILER 50К86 KEYPAD MONITOR РАЛЕ 


ISIS-II PL/M-86 V1.0 COMPILATION OF MODULE MONITOR 
OBJECT MODULE PLACED IN :F1:KEYPAD.OBJ 
COMPILER INVOKED BY: :F2:PLM86 :F1:KEYPAD.PLM LARGE ОРТІМІ2Е(2) 


$TITLE(*SDK86 KEYPAD MONITOR’) 
і ЗМОІМТУЄСТОВ 


/* 00808020208480998283406099908980:080 89804884480844888:9409208945:0(0894980808929440930928 
0Г809202848232288290448080480408084:9308080880882808000800520:080880023899:0899480844602 900808 


50К-86 КЕҮРАР МОМІТОВ, V1.1 
30 JUNE 1978 


(C) 1978 INTEL CORPORATION. ALL RIGHTS RESERVED. NO PART OF 
OF THIS PROGRAM OR PUBLICATION MAY BE REPRODUCED, TRANSMITTED, 
TRANSCRIBED, STORED IN A RETRIEVAL SYSTEM, OR TRANSLATED INTO ANY 
LANGUAGE, IN ANY FORM OR BY ANY MEANS, ELECTRONIC, MECHANICAL, 
MAGNETIC, OPTICAL, CHEMICAL, MANUAL OR OTHERWISE, WITHOUT THE PRIOR 
WRITTEN PERMISSION OF INTEL CORPORATION, 3065 BOWERS AVENUE, SANTA 
CLARA, CALIFORNIA, 95051. 


ABSTRACT 
| THIS PROGRAM IS THE ROM BASED KEYPAD MONITOR FOR THE 50К-86. 
w IT PROVIDES THE USER WITH A MODERATE LEVEL OF CAPABLILITY TO 


EXAMINIE/MODIFY MEMORY AND REGISTERS AND CONTROL PROGRAM EXECUTION. 


ENVIRONMENT 


THE SDK KEYPAD MONITOR COMMUNICATES WITH THE USER VIA THE ONBOARD 
KEYBOARD AND 7 SEGMENT DISPLAY. 


PROGRAM ORGANIZATION 


THE PROGRAM IS DIVIDED INTO 1 DATA AND 2 CODE MODULES: 


1. DATA DECLARATION MODULE, GLOBAL DATA DECLARATIONS, 
2. COMMON ROUTINES. LOWER LEVEL PROCEDURES 
3. COMMAND MODULE. INDIVIDUAL COMMANDS AND OUTER BLOCK 


ç CALLING GRAPH 


>>COMMAND DISPATCH MODULE (OUTER BLOCK) 
INDIVIDUAL COMMAND PROCEDURES 
COMMON ROUTINES 


GLOBAL DATA STRUCTURES 


THE MONITOR MAINTAINS THE USER'S MACHINE STATE (REGISTERS) IN A 
WORD ARRAY. THE REGISTERS ARE SAVED FROM THE USER'S STACK 

AS PUSHED BY PLM86 INTERRUPT PROCEDURE. 

POINTERS TO THE 50К-86 29920 ADDRESS SPACE ARE IMPLEMENTED WITH 
POINTER STRUCTURES ALLOCATED AS 2 WORD STRUCTURES. 


PL/M-36 COMPILER 50К86 KEYPAD MONITOR 


./ 


1 MONITOR:DO; 


/9 BEGINNING OF MODULE Ф/ 


/9 побоев оно ооо ооо ооо оо ооо оон ооо ооо ооо ооо ааа а ааа а ааа 
0101002072 022000 2 02 000 010200 00 00 0 00 008 0 080080 208200 0808 000 0608 0 002000 00002 0020 


GLOBAL DATA DECLARATIONS MODULE 


ABSTRACT 


THIS MODULE CONTAINS ALL THE GLOBAL DATA DECLARATIONS AND 


LITERALS (EQUATES). 


MODULE ORGAINIZATION 


2222:2:22:22:222:2:222з3222 


THE MODULE IS DIVIDED INTO 5 SECTIONS: 
GLOBAL FLAGS, VARIBLES, EQUATES 
I/O PORTS,MASKS,AND SPECIAL CHARS 


1, UTILITY SECTIO 
2. 1/0 SECTION 


3. MEMORY ARGUMENTS SECTIONS 


Ч, REGISTER SECTION 


5. BOOT AND 8089: 
9/ 


/8888989990989898849924 
е UTILITY SECTION 


SECTION 


STRUCTURES FOR MEDIUM POINTERS 


USER REGISTER SAVE AREA 
BOOTSTRAP AND 8089 DESCRIPTOR 


зозоросврозвововововево / 

2 1 DECLARE 
INTSVECTOR(5) POINTER; 

3 1 DECLARE 
MONITORS$STACKPTR WORD, 
MONITORSSTACKBASE WORD; 

4 1 DECLARE 
СОРУЯТОНТ (?) BYTE DATA ('(С) 

9 1 DECLARE 
BRKI$FLAG BYTE, 
BRKI$SAVE BYTE, 
CHAR BYTE, 
DISP(4) BYTE, 
T BYTE, 
END$OF F WORD, 
WORD$MODE BYTE, 
LAST$COMMAND BYTE; 

6 1 DECLARE 
TRUE LITERALLY "ОЕРН", 
FALSE LITERALLY ‘OOOH’, 
ADORS$FIELD LITERALLY "1", 
DATASFIELD LITERALLY "0", 
ОАТАЗВУТЕ LITERALLY '-1', 
BLANK LITERALLY "1", 
NOBLANK LITERALLY "0", 
BREAKS$INST LITERALLY "ОССН?, 
STEP$TRAP LITERALLY "0100Н", 
USER$SINIT$SP LITERALLY "100Н", 


1978 INTEL 


/% 


/% 


INTERRUPT VECTORS %/ 


MONITOR SS SAVE ?/ 


СОДР"); 


/% 
/® 
/% 
/% 


ТВОЄ ІР ВВЕАК 5ЕТ ?/ 
INST BREAK SAVE %/ 

ONE CHAR LOOK AHEAD "/ 
DISPLAY ARRAY %/ 


/% END OFFSET ADDRESS %/ 


ADDR FIELD WORD OUTPUT #/ 
DATA FIELD WORD OUTPUT %/ 
DATA FIELD BYTE OUTPUT %/ 


BREAKPOINT TRAP ®/ 
SS TRAP FLAG MASK %/ 
USER STACK INITIAL %/ 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR 


NM WWW ка) Г fo 


/а 9044088880890889409490900088888988984980898809988498209898928084608088488208080848204088084 
100 002000 EER REE EER ERE REE EER ооо ооо во вз ватт еее RR зао егете аа 


COMMON PROCEDURES 


THIS MODULE CONTAINS THOSE LOWER LEVEL PROCEDURES CALLED BY HIGHE# 
LEVEL ROUTINES. 


MODULE ORGANIZATION 


THIS MODULE CONTAINS THE FOLLOWING SECTIONS: 
1. BASIC I/O SECTION 


KB$DISPLAY DISPLAY TO LED FIELDS 
KB$BLANK$DATA$FIELD BLANK DATA FIELD WITH PROMPTS 
KBSBLANK$ADDR$FIELD BLANK ADDRESS FIELD WITH PROMPTS 
КВУООТЗВҮТЕ OUTPUT А BYTE ТО DISPLAY 
KBSOUT$WORD OUTPUT A WORD TO DISPLAY 
KB$GET$CHAR INPUT A CHAR FROM KEYPAD 

2. ARGUMENT EXPRESSION EVALUATOR 
КВЗСЕТЗЕХРН GET WORD EXPRESSION 
KB$GET$ADDR GET ADDRESS EXPRESSION 
КВФОРОАТЕФІР GET OPTIONAL CS:IP 

3. INTERRRUPT AND RESTORE/EXECUTE ROUTINES 
SAVE$REGISTERS SAVES USERS REGISTERS 
RESTORE$EXECUTE RESTORE MACHINE STATE AND EXEC 
INTERRUPRI$SENTRY INTERRUPT FOR SINGLE STEP 
INITERRUPT3$ENTRY INTERRUPT ROUTINE FOR GO 
INIT$INT$VECTOR INITIALIZES INTERRRUPT VECTORS 


#/ 


1% 00000 ово ава оваа но» 


• BASIC І/О SECTION ы 
ооо о ооо сссововонае / 


KB$DISPLAY: 

/а THIS ROUTINE DISPLAYS THE CONTENTS OF THE ARRAY POINTED TO BY 
THE FIRST PARM TO THE FIELD SPECIFIED BY THE SECOND (ADDR OR 
DATA). THE NUMBER OF DECIMAL POINTS OR PROMPTS IS DETERMINED 
BY THE THIRD PARAMETER #/ 

PROCEDURE (PTR,FIELD, PROMPTS); 

DECLARE PTR POINTER, (FIELD,PROMPTS,T) BYTE, 
DISPLAY BASED PTR (1) BYTE; 
ТЕ FIEUD=ADDR$FIELD THEN 
OUTPUT(KB$STAT$PORT) = 94H; 79 ADDRESS FIELD %/ 
ELSE 
OUTPUT(KB$STAT$PORT) 
DO 1-0 TO 3; 
Т = DISPLAY(3-I); /® DISPLAY ЗАСКИАРСО! 


90H; /% DATA FIELD %/ 


IF PROMPTS>I THEN Т = т OR 80H; 
OUTPUT(KB$DATA$PORT) = Т; 
END; 
END; 


KB$BLANK$DATA$FIELD: 


е; 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


NNN 


M ww ЕЈ 


го лм fT ГО ЕЈ 


N N кај Е Е ЈОЈ МОЈ ОЈ ГО го 


-а 


мом 


/9 THIS ROUTINE BLANKS THE DATA FIELD OF THE DISPLAY WITH THE 

NUMBER OF PROMPTS (DECIMAL POINTS) AS SPECIFIED BY THE PARAMETER. #/ 
PROCEDURE( PROMPTS); 

DECLARE PROMPTS BYTE; 

CALL KBS$SDISPLAY( ОКВЗВГАНКО, DATA$FIELD, PROMPTS); 
END; 


KBSBLANK$ADDRSFIELD: 
/9 THIS PROCEDURE BLANKS THE ADDRESS FIELD OF THE DISPALY WITH THE 
NUMBER OF PROMPTS SPECIFIED BY THE PARAMETER "РВОМРТ5", ®/ 
PROCEDURE( PROMPTS); 
DECLARE PROMPTS BYTE; 
CALL KB$DISPLAY( @KBSBLANKS, ADDR$FIELD, PROMPTS); 
END; 


KBSOUT$BYTE: 

/® THIS ROUTINE OUTPUTS THE BYTE INPUT FROM THE FIRST PARAMETER 
TO THE DATA FIELD WITH THE NUMBER OF PROMPTS SPECIFIED BY THE 
SECOND PARAMETER. ?/ 

PROCEDURE(B, PROMPTS); 

DECLARE (B,PROMPTS) BYTE; 
DISP(0),DISP(1) з O; /% FIRST TWO BLANK %/ 
DISP(2) = LED(SHR(B,4) AND OFH); 
DISP(3) = LED(B AND ОЕН); 
CALL KB$DISPLAY( @DISP,DATA$FIELD,PROMPTS); 
END; 


KBSOUT$WORD: 
/9 THIS ROUTINE OUTPUTS THE FIRST PARM TO THE FIELD SPECIFIED 
BY THE SECOND WITH THE NUMBER OF PROMPTS SPECIFIED BY THE THIRD. 
LEADING ZERO BLANKING IS PERFORMED IF SPECIFIED BY THE FOURTH 
PARAMETER. */ 
PROCEDURE(W,FIELD, PROMPTS, BLANKING) ; 
DECLARE W WORD, (FIELD,PROMPTS,BLANKING) BYTE; 


DO 120 TO 3; 
DISP(I) = ЕР(5НК(М,(3-1)94) AND ОООЕН); 

END; 

IF BLANKING=BLANK THEN /% BLANK LEADING 0'5 9/ 
00; 
I з O: 


, 
DO WHILE DISP(I)=3FH AND І<3; 
DISP(I) г O; 


I = Із 15 
END; 
END; 
CALL KB$DISPLAY(@DISP,FIELD,PROMPTS); 
END; 
KB$GET$CHAR: 


/% READS ONE CHARACTER FROM THE FIFO ОР THE 8279, WAITS UNTIL 
CHARACTER IS AVAILABLE AND THEN RETURNS THE CHARACTER IN GLOBAL 
VARIABLE ‘CHAR’, 9/ 

PROCEDURE; 

DO WHILE (INPUT(KB$STATS$PORT) AND KBSINRDY)=0; END; 
ОПТРИТ ( КВЗЗТАТЗРОВТ) = ОЦОН; /® ENABLE ТМРОТ DATA ?/ 
CHAR = ТМРЏТ(КВЗОАТАЗРОВНТ); /% READ CHARACTER %/ 

ЕНО; 


PL/M-86 COMPILER 


SDK86 KEYPAD MONITOR | РАСЕ 
СОФСОММАНО LITERALLY "2", /% GO COMMAND CODE #/ 
SS$COMMAND LITERALLY "3", 


1% 20200 00000 ваа ава ааа аа ааа 


Ы 1/0 DECLARATIONS SECTION 9 
98899899080994089999090000909808/ 


7 1 DECLARE 
KB$STAT$PORT LITERALLY ‘OFFEAH', /% STATUS/COMMAND PORT %/ 
КВУПрАТАРОНТ LITERALLY "ОРЕЕ8Н", /9 DATA PORT #/ 
KB$INIT$MODE LITERALLY "ООН?, /% 8 8-ВІТ, LEFT ENTRY, 
< ENCODE, 2 KEY LOCKOUT #/ 
KB$INIT$SCAN LITERALLY "ЗЭН", /% 10MS SCAN RATE #/ 
KB$INRDY LITERALLY "ОТН?, из IN CHAR НОТ MASK #/ 
KB$CMND$PMT(®) BYTE DATA (40H,00H,00H,00H), /® "- то жу 
KB$SIGNON( ®) BYTE DATA (40H,00H,7FH,7DH), /% "- 86" %/ 
KB$VERSION( є) BYTE DATA (00H,00H,86H,06H), /% ' 1,1" 9/ 
KB$REGS$PMT( 9) BYTE DATA (50H,00H,00H,00H), /% "В ' 8/ 
KBSERR$MSG( 9) BYTE DATA (40H,79H,50H,50H), /% "-ЕНН" ®/ 
КВЗЕХЕС( ®) BYTE DATA (79Н,00Н,00Н,00Н), /® "Е "жу 
КВЗВАК (2) BYTE DATA (7СН,50Н,00Н,00Н), / "ВВ ' •/ 
KB$BLANKS( ®) BYTE DATA (00H,00H,00H,00H), /9 ' © жу 
LED(®) BYTE DATA 
(3FH,06H,5BH,4FH,66H,6DH,7DH,07H, ге IO tae Te жу 
ТЕН,бЕН,77Н,7СН,39Н,5ЕН,79Н,71Н); ие "В: "Е" 9/ 
8 1 DECLARE 
KBPER LITERALLY '108', /% PERIOD ./ 
КВСОМ LITERALLY '11Н', /% СОММА е / 
KBREGKEY LITERALLY ‘15H’, /% REGISTER KEY 9 / 
KBCOL LITERALLY  "14Н", /9 COLON (SEGMENT) #/ 
KBPLUS LITERALLY '13Н', /% PLUS KEY е 
KBMINUS LITERALLY ‘'12H'; /% MINUS KEY е/ 


1% 200000000000 000000000 


е POINTER SECTION ы 
9009099090908990909098900/ 


Э 1 DECLARE 


MEMORYS$ARGI$PTR POINTER, /% ARGUMENT 1 %/ 
АКО! STRUCTURE (OFF WORD, SEG WORD) 
АТ (@MEMORYSARGI$PTR), 
MEMORY$ARG1 BASED MEMORY$ARGI$PTR BYTE, 
MEMORY$WORD$ARG1 BASED MEMORY$ARGI$PTR WORD, 


MEMORYS$ARG3$PTR POINTER, /% ARGUMENT 3 %/ 
ARG3 STRUCTURE (OFF WORD, SEG WORD) 

АТ (@MEMORYS$ARG3$PTR), 
MEMORY$ARG3 BASED MEMORY$ARG3$PTR BYTE, 


MEMORY$BRKI$PTR POINTER, /® BREAKPOINT */ 
ВЕК! STRUCTURE (OFF WORD, SEG WORD) 

АТ (@МЕМОВУЗВАКТЗРТЯ), 
MEMORY$BRK1 BASED MEMORY$BRKI$PTR BYTE, 


MEMORY$CSIP$PTR POINTER, /% CS:IP INSTRUCTION %/ 
CSIP STRUCTURE (OFF WORD, SEG WORD) 
AT (@MEMORYS$CSIP$PTR), 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAG 


MEMORYS$CSIP BASED MEMORYS$CSIP$PTR BYTE, 


MEMORYSUSERSTACK$PTR POINTER, 

USERSTACK STRUCTURE (OFF WORD, SEG WORD) 
АТ (@MEMORY$USERSTACKS$PTR), 

MEMORY$USERSTACK BASED MEMORYSUSERSTACKS$PTR WORD; 


79 USER'S STACK #/ 


1% 220200 0002002 аа ва ваа аа 


ы REGISTER SECTION Ы 
аагававаааова даваа ваа / 


а DECLARE 
КВЗЯЕС( в) ВТТЕ DATA 
(00Н,77Н,О00Н,7СН,0ОН,З39Н,00Н,5ЕН, /9 AXBXCXDX %/ 
60Н,73Н,7СН,73Н,60Н,30Н,5ЕН,30Н, /8 SPBPSIDI %/ 
39H,6DH,5EH,6DH,6DH,6DH,79H,6DH, /% CSDSSSES %/ 
30H,73H,71H, 38H), /% ТРЕ ./ 
REG$SAV(14) WORD, /9 USER'S SAVED АЕСЗ #/ 
REGS$ORD(®) BYTE DATA 
(% 8,43 3 0 0.9 11 39.8 135, /® STACKED REG ORDER %/ 
SP LITERALLY 'REGS$SAV( 4)", 
BP LITERALLY 'REG$SAV( 5)", 
cs LITERALLY 'REG$SAV( 8)', 
DS LITERALLY 'REG$SAV( 9)', 
55 LITERALLY 'ВЕСЗЗАЧ( 10)", 
Е5 LITERALLY " ВЕСЗЗАТ( 11)", 
ТР LITERALLY " ВЕСЗАТ( 12)", 
FL LITERALLY 'REG$SAV(13)'; 
/ + 20202 20000020000 00 00 ваа аа ааа ааа 
® BOOTSTRAP JUMP AND 8089 VECTOR * 
0122200200 02 000 20000 00000 060000 аа ааа ааа / 
/® THIS BOOT CONSISTS OF A LONG JUMP TO THE BEGINNING OF THE MONITOR 
АТ РРОО+ХХХХ WHERE XXXX IS THE STARTING ADDRESS OFFSET (IP) AND 
MUST BE DETERMINED AFTER EACH COMPILE. Ф/ 
їз. 4 DECLARE 
START$ADDR LITERALLY "009СН", /9 STARTING ADDRESS %/ 
ВООТ1(9) BYTE АТ (ОРЕРРОН) РАТА (ОВАН), /% LONG JUMP ОРСОРЕ #/ 
во0т2(#) WORD АТ (ОРРРЕТН) DATA (STARTS$ADDR), 
BOOT3(®) WORD AT (OFFFF3H) DATA (OFFOOH); /® SEGMENT ADDRESS %/ 
/9 THIS TWO-WORD DATA IS A JUMP TO THE STARTING ADDRESS AND IS LOCATED 
AT THE FIRST LOCATION OF ROM (NO OTHER DATA OR CONSTANT DECLARATIONS 
MAY PRECEDE ІТ). THE JUMP IS ACTUALLY TO (START-ADDR)-4 SINCE THE 
INSTRUCTION IS A RELATIVE JUMP OF LENGTH 3. Ф/ 
2 1 DECLARE 
800Т8(9) WORD РАТА (OE99O0H,START$ADDR-u); /% МОР,ЈМР START-ADDR */ 
/9 THIS BLOCK. OF ROM AT FFFF6-FFFPA IS INITIALIZED FOR THE 8089 
DEVICE AND POINTS TO A BLOCK OF RAM AT LOCATION 100H. #/ 
13 + DECLARE 
BLOCK$8089 WORD AT (OFFFF6H) DATA (00001H), 
BLOCK$8089$PTR POINTER AT (OFFFF8H) DATA (00100H); 


к: 


Р,/М-86 COMPILER SDK86 KEYPAD MONITOR 


/б 898484989898889980999890889280992090928989380990282930234892808099808892049489020898808809 
90000009 90090 о ооо о осо ооо оо ааа ооо ааа 509500 00060606 ааа аа аа ааа аа 


COMMON PROCEDURES 
222222222222222=22= 


ABSTRACT 


THIS MODULE CONTAINS THOSE LOWER LEVEL PROCEDURES CALLED BY HIGHER 
LEVEL ROUTINES. 


MODULE ORGANIZATION 

22222222222222222=2 

THIS MODULE CONTAINS THE FOLLOWING SECTIONS: 
1. BASIC I/O SECTION 


KB$DISPLAY DISPLAY TO LED FIELDS 
KB$BLANK$DATA$FIELD BLANK DATA FIELD WITH PROMPTS 
KB$BLANK$ADDR$FIELD BLANK ADDRESS FIELD WITH PROMPTS 
KB$OUT$BYTE OUTPUT A BYTE TO DISPLAY 
KBSOUTSWORD OUTPUT A WORD TO DISPLAY 
КВЗСЕТЗСНАЯ INPUT A CHAR FROM KEYPAD 

2. ARGUMENT EXPRESSION EVALUATOR 
KB$GET$EXPR GET WORD EXPRESSION 
KB$GET$ADDR GET ADDRESS EXPRESSION 
KB$UPDATE$IP GET OPTIONAL С5:ТР 

З, INTERRRUPT AND RESTORE/EXECUTE ROUTINES 
SAVE$REGISTERS SAVES USERS REGISTERS 
ВЕЗТОВЕЗЕХЕСЏТЕ RESTORE MACHINE STATE AND ЕХЕС 
INTERRUPRI$SENTRY INTERRUPT FOR SINGLE STEP 
INITERRUPT3$ENTRY INTERRUPT ROUTINE FOR GO 
ТНТТЗТНТЗУЕСТОН INITIALIZES INTERRRUPT VECTORS 


9/ 


/ФФееегеегееегевеееееееееегге 


е BASIC I/O SECTION е 
999080980899999909990980488/ 


14 1 КВУОТЗРЬАҮ: 
/% THIS ROUTINE DISPLAYS THE CONTENTS OF THE ARRAY POINTED ТО BY 
THE FIRST PARM TO THE FIELD SPECIFIED BY THE SECOND (ADDR OR 
DATA). THE NUMBER OF DECIMAL POINTS OR PROMPTS IS DETERMINED 
BY THE THIRD PARAMETER %/ 
PROCEDURE (PTR,FIELD, PROMPTS); 
19 2 DECLARE PTR POINTER, (FIELD,PROMPTS,T) BYTE, 
DISPLAY BASED PTR (1) BYTE; 


16 2 ТЕ FIEUDsADDR$FIELD THEN 
17 2 OUTPUT(KB$STAT$PORT) = 94H; и? ADDRESS FIELD %/ 
ELSE 
18 2 ОЏТРОТ(КВЗ5ТАТЗРОВТ) = 90H; /% DATA FIELD ®/ 
19 2 00 1-0 TO 3; 
20 3 T = DISPLAY(3-I); /® DISPLAY SACKWAPTS! 
21 3 IF PROMPTS>I THEN Т = т OR ВОН; 
23 3 OUTPUT(KB$DATA$PORT) = T; 
24 3 END; 
25 2 END; 


25 1 KB$BLANK$DATA$FIELD: 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


Мо N 


-» 


омо мо Ñ Гу го 


юм ББ 45 чл) чл) № Г ла) кл) А Г) 


са 


мм 


/* THIS ROUTINE BLANKS THE DATA FIELD ОР THE DISPLAY WITH THE 
NUMBER OF PROMPTS (DECIMAL POINTS) AS SPECIFIED BY THE PARAMETER. #/ 
PROCEDURE( PROMPTS); 
DECLARE PROMPTS BYTE; 
CALL KBSDISPLAY( @KBSBLANKS, DATASFIELD, PROMPTS); 
END; š 


KB$BLANK$ADDR$FIELD: 
/% THIS PROCEDURE BLANKS THE ADDRESS FIELD OF THE DISPALY WITH THE 
NUMBER OF PROMPTS SPECIFIED BY THE PARAMETER "РВОМРТ5", 9?/ 
PROCEDURE( PROMPTS); 
DECLARE PROMPTS BYTE; 
CALL KBSDISPLAY( @KBSBLANKS, ADDR$FIELD, PROMPTS); 
END; 


KBSOUTSBYTE: 

/% THIS ROUTINE OUTPUTS THE BYTE INPUT FROM THE FIRST PARAMETER 
TO THE DATA FIELD WITH THE NUMBER OF PROMPTS SPECIFIED BY THE 
SECOND PARAMETER. %/ 

PROCEDURE(B, PROMPTS); 
DECLARE (B,PROMPTS) BYTE; 
DISP(0),DISP(1) = 0; /9 FIRST TWO 3LANK ®/ 
DISP(2) = LED(SHR(B,4) AND ОРН); 
DISP(3) = LED(B AND OFH); 
CALL KB$DISPLAY( @DISP, DATA$FIELD, PROMPTS); 

END; 


KB$OUT$WORD: 
/® THIS ROUTINE OUTPUTS THE FIRST PARM TO THE FIELD SPECIFIED 
BY THE SECOND WITH THE NUMBER OF PROMPTS SPECIFIED BY THE THIRD. 
LEADING ZERO BLANKING IS PERFORMED ТЕ SPECIFIED BY THE FOURTH 
PARAMETER. %/ 
PROCEDURE(W,FIELD, PROMPTS, BLANKING); 
DECLARE И WORD, (FIELD,PROMPTS,BLANKING) BYTE; 
00 1:0 TO 3; 
DISP(I) = LED(SHR(W,{(3-1)8%) AND OOOFH); 
END; 
ІР BLANKING=sBLANK THEN /% BLANK LEADING 0'5 Ф/ 
00; 
I = O; 
DO WHILE DISP(I)=3FH AND І<3; 
DISP(I) = 0; 
І з I 1; 
END; 
END; 
CALL KB$DISPLAY( @DISP,FIELD, PROMPTS); 
END; 


КВЗСЕТЗСНАЯ: 
/9 READS ONE CHARACTER FROM THE FIFO ОР THE 8279, WAITS UNTIL 
CHARACTER IS AVAILABLE AND THEN RETURNS THE CHARACTER IN GLOBAL 
VARIABLE ‘CHAR’. 9/ 


PROCEDURE; 
DO WHILE (INPUT(KBSSTATS$PORT) AND KBSINRDY)=0; ZND; 
OUTPUT(KBS$STATS$PORT) = ОЦОН; /% ENABLE INPUT DATA 2/ 
CHAR з INPUT(KBSDATASPORT); /9 READ CHARACTER "/ 
END; 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


/94888848949408908948980890880889480848088:44:808900 0 панаваана 


s ARGUMENT EXPRESSION EVALUATOR SECTION е 
зроресзовововоововвоввввововозововововововаво / 


62 1 КВЗОЕТЗЕХРИ: 
/% THIS ROUTINE GATHERS CHARACTERS FROM THE INPUT STREAM 
AND FORMS A WORD EXPRESSION WHICH IS RETURNED AS THE VALUE 
OF THE PROCEDURE. THE CHARACTERS INPUT ARE ECHOED TO THE 
ADDRESS OR DATA FIELD AS SPECIFIED BY THE FIRST PARAMETER. 
IF THE FIRST PARM IS О (ADDR) OR 1 (DATA) THEN THE EXPRESSION IS 
OUTPUT AS A WORD AND ТЕ -1 (DATA$BYTE) THEN AS A BYTE ALWAYS IN 
DATA FIELD. THE NUMBER OF PROMPTS BY THE SECOND PARM, AND LEADING 
ZERO BLANKING BY THE THIRD. EXPRESSION ARE TERMINATED WITH 
А COMMA,PERIOD OR COLON. ‘CHAR’ WILL CONTAIN ONE OF THESE 
ON EXIT. %/ 
PROCEDURE (FIELD,PROMPTS, BLANKING) WORD; 
DECLARE (FIELD,PROMPTS,BLANKING) BYTE, 
(SAVE,W) WORD, OPER BYTE; 


© 
МА) 
го 


ТЕ FIELD=DATA$BYTE THEN 
CALL KB$OUT$BYTE(LOW( SAVE) ,PROMPTS); 
ELSE 


64 2 OPER = KBPLUS; 
65 2 W з 0; 
66 2 DO WHILE TRUE; 
67 3 ТЕ CHARsKBREGKEY THEN 
68 3 DO; /® REGISTER NAME ®/ 
69 4 CALL KB$DISPLAY( @KB$REG$PMT,FIELD,PROMPTS); 
70 4 CALL KB$GET$CHAR; 
71 4 IF CHAR>ODH THEN СОТО ERROR; /® INVALID REG KEY %/ 
73 4 SAVE = REG$SAV(CHAR); 
4 
4 


76 4 CALL KB$OUT$WORD(SAVE,FIELD,PROMPTS,BLANKING); 
77 4 CALL KB$GET$CHAR; 
78 4 END; 
ELSE 
79 ро; /® NUMBER #/ 
80 ТЕ CHAR>OFH ТНЕМ СОТО ERROR; /* INVALID DIGIT #/ 
SAVE = 0; 


DO WHILE CHAR<=0FH; 
SAVE = SHL(SAVE,4) + DOUBLE( CHAR); 
IF FIELD=DATA$BYTE THEN 
CALL KBS$OUT$BYTE(LOW( SAVE) ,PROMPTS); 
ELSE 


а 
295) 
ЛАЛЕ Е во 


87 5 CALL KB$OUT$WORD(SAVE,FIELD,PROMPTS,BLANKING); 
68 5 CALL KB$GET$CHAR; 
39 5 END; 
30 4 END; 
) 1 3 ТЕ OPER=KBPLUS THEN /% EVAL PREV OPER #/ 
32 3 Я = W + SAVE; 
ELSE 
93 3 W = И - SAVE; 
9 4 3 ТЕ FIELD=DATA$BYTE THEN 
95 3 CALL KB$OUT$BYTE(LOW(W),PROMPTS); 
ELSE 
35 CALL KB$OUT$WORD(W,FIELD,PROMPTS,BLANKING); 


ТЕ CHAR=KBCOM OR CHAR=KBPER OR CHAR=KBCOL THEN 


ке) 
~ 
МА) МА) 


Р,/М-86 COMPILER SDK86 KEYPAD MONITOR 
98 3 RETURN W; 
99 3 IF CHARsKBPLUS OR CHAR=KBMINUS THEN 
100 3 OPER = CHAR; 
ELSE 
101 3 GOTO ERROR; 
102 3 CALL KB$GET$CHAR; /% GET NEXT CHAR #/ 
103 3 END; 
104 2 END; 
105 1 KB$GET$ADDR: 
/% THIS ROUTINE GATHERS CHARACTERS FROM THE INPUT STREAM AND 
FORMS AN ADDRESS EXPRESSION OF SEGMENT PART AND OFFSET PART. 
THE FIRST CHARACTER HAS ALREADY BEEN READ INTO GLOBAL "СНАП", 
IF NO SEGMENT IS ENTERED, THE SECOMD PARM DEFAULT IS USED, THE 
ADDRESS EXPRESSION IS DISPLAYED IN THE ADDRESS FIELD WITH THE 
NUMBER OF PROMPTS SPECIFIED BY THE THIRD PARM, %/ 
PROCEDURE( PTR, DEFAULT$BASE, PROMPTS); 
106 2 DECLARE PTR POINTER, DEFAULT$BASE WORD, PROMPTS BYTE, 
ARG BASED PTR STRUCTURE (OFF WORD, SEG WORD); 
107 2 ARG.SEG з DEFAULTS$BASE; 
108 2 ARG.OFF = KB$SGETS$EXPR(ADDR$FIELD, PROMPTS, BLANK); 
109 2 IF CHAR=KBCOL THEN /9 SEGMENT SPEC'D #/ 
110 2 00; 
111 3 CALL КВЗСЕТЗСНААЯ; 
112 3 ARG.SEG = ARG.OFF; 
113 3 ARG.OFF = KB$GET$EXPR(ADDR$š$FIELD,PROMPTS,BLANK); 
114 3 ТЕ CHARsKBCOL THEN GOTO ERROR; 
116 3 END; 
117 2 END; 
118 1 КВЗОРРАТЕЗІР: 
/а THIS ROUTINE IS CALLED BY SINGLE STEP AND GO TO OUTPUT THE CURRENT 
CS: IP AND THE CURRENT INSTRUCTION BYTE. CS:IP IS OPENED FOR 
OPTIONAL INPUT. Ф/ 
PROCEDURE; 
119 2 CALL KB$SOUTS$WORD(IP,ADDR$FIELD,1,BLANK); /% DISPLAY ІР Ф/ 
120 2 CSIP.OFF = IP; 
121 2 CSIP .SEG = CS; 
122 2 CALL KB$SOUT$BYTE(MEMORY$CSIP,0); 
123 2 CALL КВ9СЕТЭСНАВ; 
124 2 ІР CHAR<>KBCOM AND CHAR<>KBPER THEN 
125 2 DO; /® CHANGE CS:IP #/ 
126 3 CALL KB$SBLANKS$ADDRS$FIELD(1); 
127 3 CALL KB$SBLANK$DATAS$FIELD(0); 
128 3 CALL KBS$GETS$ADDR(@CSIP,CS,1); 
129 3 END; 
130 2 END; 
120000020000 20000 00 аа ааа аа ааа аа ааа ааа аа а за 
° INTERRUPT AND RESTORE/EXECUTE SECTION . 
892808992:899999899899989994898923284999:249980848988889/ 
131 1 ЗАУЕӚВЕСІ5ТЕН5: 


/% THIS ROUTINE IS USED ТО SAVE THE STACKED USER'S REGISTERS IN THE 
MONITOR'S SAVE AREA. %/ 
PROCEDURE; 


PAGE 





2 /М-86 COMPILER 


132 
133 
134 
135 
136 
(37 
138 
139 
140 


141 


142 


143 
144 
145 
146 
147 
148 
149 
150 
151 
152 


193 


154 
155 
156 
157 
158 
159 
160 


fN го № лә о хл) г № Г 


— 


= Момо .2 мл) го 


NNMN гу МА 


REG$SAV( ВЕСЗОНО(Т)) = MEMORY$USERSTACK; 
USERSTACK.OFF = USERSTACK.OFF + 2; 


END; 
SS = USERSTACK.SEG; 
SP = USERSTACK.OFF; 
END; 
КЕЗТОНЕЗЕХЕСИТЕ: 


/% THIS PROCEDURE RESTORES THE STATE O THE USER MACHINE AND 


PASSES CONTROL BACK TO THE USER PROGRAM. IT CONTAINS A 
MACHINE LANGUAGE SUBROUTINE TO PERFORM THE POPPING OF THE 
USER REGISTERS AND TO EXECUTE AN 'IRET' TO TRANSFER CONTROL 
TO THE USER'S PROGRAM. ?/ 


PROCEDURE; 
DECLARE RESTORE$EXECUTE$CODE(*®) BYTE DATA 
(08BH,OECH, /% MOV BP,SP ё; 
O8BH,086H,002H, /8 МОМ АХ,/ВР/.РАВМ2 %/ 
08ВН,05ЕН,004Н, /8 MOV BX,/BP/.PARM1 %/ 
08EH, ODOH, /8 MOV SS,AX У, 
ОВВН,ОЕЗН, /а МОУ 5Р,ВХ 8 / 
0508, /9 POP ВР ./ 
05ЕН, /4 РОР DI ./ 
О5ЕН, /9 РОР 51 У, 
058Н, /9 РОР ВХ ./ 
ОБАН, /8 POP DX 8 / 
059Н, /% POP СХ ./ 
0588, /® POP АХ ./ 
ӘЛЕН, /% РОР DS ./ 
007H, /4 POP ES ./ 
ОСЕН) /9 IRET е/ 


RESTORE$EXECUTE$CODE$PTR WORD DATA ( .RESTORE$EXECUTE$CODE) ; 


USERSTACK.SEG = SS; 
USERSTACK.OFF = SP; 


DO 1:0 TO 10; /® PUSH USER'S REGISTERS ONTO HIS STACK #/ 


USERSTACK.OFF = USERSTACK.OFF - 2; 
MEMORY$USERSTACK = REG$SAV(REG$ORD(10-I)); 
END; 
USERSTACK.OFF = USERSTACK.OFF - 2; 
MEMORY$USERSTACK = BP; 
CALL RESTORE$EXECUTE$CODE$PTR(USERSTACK.OFF,USERSTACK.SEG); 


ND; 


INTERRUPTI$ENTRY: 
/% THIS PROCEDURE IS CALLED WHEN THE CPU IS INTERRUPTED BY ЕХЕСИТ, МС 


AN INSTRUCTION WITH THE TRAP BIT SET (SINGLE STEP), %/ 


PROCEDURE INTERRUPT 1; 


USERSTACK.OFF = STACKPTR; 
USERSTACK.SEG = STACKBASE; 
STACKPTR = MONITOR$STACKPTR; 
STACKBASE = MONITOR$STACKBASE; 
CALL SAVE$REGISTERS; 

FL з FL AND (NOT STEPS$TRAP); 

ТЕ LAST$COMMAND<>SS$COMMAND THEN 


/9 SAVE USER STACK INFO #/ 


/9 CLEAR STEP FLAG #/ 


SDK86 KEYPAD MONITOR PAG 
BP = MEMORY$USERSTACK; 

USERSTACK.OFF = USERSTACK.OFF + Ц; 

DO 120 TO 10; /% POP REGISTERS OFF CF STACK 9/ 


Р./М-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


161 2’ CALL ВЕЗТОЯЕЗЕХЕСУТЕ; /% CONTINUE IF NOT SS #/ 

162 2 CALL КВЗОРОАТЕЗІР; 

163 2 ІР CHARsKBCOM THEN 

164 2 DO; 

165 3 IP = СЗІР,ОРЕ; 

166 3 CS = CSIP.SEG; 

167 3 FL = FL OR ЗТЕРЗТВАР; /8 SET STEP FLAG #/ 

168 3 CALL ВЕЗТОВЕЗЕХЕСУТЕ; 

169 3 END; | 

170 2 IF CHAR<>KBPER THEN GOTO ERROR; 

172 2 GOTO AFTER$COMMAND; 

173 2 END; 

174 1 INTERRUPT3$ENTRY: 

/а THIS PROCEDURE IS CALLED WHEN THE CPU EXECUTES A "ТНТ 3° INSTRUCTION. 
THE MONITOR INSERTS THIS (OCCH) FOR A BREAKPOINT. ALSO AN EXTERNAL 
INTERRUPT OR A USER SOFTWARE INTERRUPT MAY CAUSE THIS PROCEDURE TO BE 
CALLED. ®/ 
PROCEDURE INTERRUPT 3; 

175 2 USERSTACK.OFF = STACKPTR; /9 SAVE USER STACK INFO 8/ 

176 2 USERSTACK.SEG = STACKBASE; 

177 2 ЗТАСКРТЯ = MONITOR$STACKPTR; 

178 2 STACKBASE = MONITOR$STACKBASE; 

179 2 CALL SAVE$SREGISTERS; 

180 2 GOTO AFTER$INTERRUPT; 

181 2 END; 

182 1 ІМІТФІНТФфУЄСТОЯ: 


/% THIS ROUTINE INITIALIZES АМ INTERRRUPT VECTOR AS FOLLOWS: THE OFFSET 
FROM THE ADDRESS OF "ТМТЗВОЏТТМЕ" CORRECTED BY THE APPROPRIATE 
NUMBER OF BYTES FOR THE INTERRUPT PLM PROLOGUE. THE SEGMENT FROM THE 
CURRENT CS REGISTER IS DETERMINED BY A MACHINE LANGUAGE CODED 
SUBROUTINE. %/ 
PROCEDURE( INT$SVECTORSPTR, INT$ROUTINESOFFSET) ; 
183 2 DECLARE ТМТЗУЕСТОВЗРТА POINTER, ТМТЗНОЏТТНЕЗОРЕЗЕТ WORD, 
VECTOR BASED INT$VECTOR$PTR STRUCTURE (OFF WORD, SEG WORD), 
CORRECTION LITERALLY ‘19H’, /% OFFSET FOR PROLOGUE е / 
INIT$SINT$SVECTOR$CODE(®) BYTE DATA 


(0558, /% PUSH ВР 8 / 
ОВВН ,ОЕСН, /® MOV ВР ,5Р е / 
08СН,0С8Н, /9 MOV АХ, СЗ 8 / 
ОСЧН,ОБЕН,ООЧН, /9 LES ВХ,/ВР/„РАВМ1 8 / 
026H,089H,007H, /% MOV ES:W/BX/,AX 8/ 
050Н, /% POP ВР е / 
0С2Н,004Н,00О0Н), из RET 4 * / 
INIT$INT$VECTOR$CODE$PTR WORD DATA (.ІМІТ%ІМТ9УЕСТОВ9СОФЕ); 
184 2 CALL INITSINTS$SVECTORSCODE$PTR( @VECTOR.SEG); /% SEGMENT PORTION 9/ 
185 2 VECTOR.OFF = INT$ROUTINESOFFSET - CORRECTION; /9 OFFSET PORTION #/ 
186 2 END; 


/% 0020 000 00 000 00 00 000 00 ооо оо ааа аа аа аа аа а е а ааа а а а а а а а аа аа аа за 
12022002 2021021 0 0100 22 0102 00082068 0000 ооо оо аа ааа аааа ааа ааа ааа ааа аа аа ва 


COMMAND MODULE 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


187 


188 
189 
190 
191 
192 
193 
191 
195 
197 
198 
199 
201 
202 


203 


206 
207 
208 
209 
210 
211 


212 


КА) КАЈ МАУ КАЈ МАЈ Www Www № № № 


го 


әм МУ ~ 


ABSTRACT 


THIS MODULE CONTAINS ALL THE COMMANDS IMPLEMENTED AS INDIVIDUAL PROCEDURES 
AND CALLED FROM THE OUTER BLOCK OF THE COMMAND DISPATCH LOOP. 


MODULE ORGANIZATION 
THIS MODULE CONTAINS THE FOLLOWING SECTIONS: 


1. COMMANDS SECTION 


KB$GO GO 
KB$SINGLE$STEP SINGLE STEP 
КВЗЕХАМЗМЕМ SUBSTITUTE MEMORY 
КВЗЕХАМЗНЕО ЕХАМТМЕ REGISTER 
KB$MOVE MOVE 
КВФІМРОТ INPUT PORT 
КВЗОЏТРОТ ОЏТРОТ PORT 
2. COMMAND DISPATCH (OUTER BLOCK, MAIN PROGRAM LOOP) 
NEXT$COMMAND DISPATCH 
ERROR ERROR ROUTINE 


ку 


/ + 2000000 00 ово 00007 ев те че 


? COMMANDS SECTION 8 
гавававававананавана ааа / 


KB$GO: 

/* IMPLEMENTS THE 'GO' COMMAND. DISPLAYS IP AND CURRENT INSTRUCTION 
BYTE AND OPENS CS:IP FOR INPUT AND ONE OPTIONAL BREAKPOINT. 
BEGINS EXECUTION WHEN A PERIOD IS DEPRESSED AND DISPLAYS "Е" IN 
THE ADDRESS FIELD. UPON ENCOUNTERING A BREAKPOINT, ‘BR’ IS 
DISPLAYED IN THE DATA FIELD. %/ 


PROCEDURE; 
CALL КВЗОРОАТЕ$ ІР; /% OPTIONAL CHANGE С5:ІР */ 
IF CHAR=KBCOM THEN 
DO; / 9 BREAKPOINT ?/ 


CALL KB$BLANK$ADDR$FIELD(1); 

CALL KB$BLANK$DATA$FIELD(O); 

CALL KB$GET$CHAR; 

CALL KB$GET$ADDR(@BRK1,CSIP.SEG,1); 

IF CHAR<>KBPER THEN GOTO ERROR; 

BRKI$SAVE = MEMORY$BRK1; 

MEMORY$BRK1 = BREAK$INST; 

IF MEMORY$BRK1<>BREAK$INST THEN GOTO ERROR; 
BRKI$FLAG = TRUE; 


IF CHAR<>KBPER THEN GOTO ERROR; 
CALL KB$DISPLAY( @KB$EXEC,ADDR$FIELD,0O); 
CALL KB$BLANK$DATA$FIELD(0); 

IP = CSIP.OFF; 


CS = CSIP.SEG; 
FL з FL AND (NOT STEP$TRAP); 
CALL RESTORE$EXECUTE; 


END; 


KB$SINGLE$STEP: 


PL/M-86 COMPILER 


222 
223 
224 
225 
226 
228 
229 
230 
831 


232 
233 
234 
236 
237 
238 
239 
240 
242 
243 
245 


246 
247 
248 
250 
697 
253 
254 
256 
257 


258 
259 
260 


261 


д хә ә Го Го ГО 


Www 42 Б Б БЕ о) 5 Е += = + ка) МА) МАЈ КА) КА) КА) МАМА ка) Г ГӘ МА ЕЈ — 


Ме) м 


— 


/9 IMPLEMENTS THE SINGLE STEP COMMAND. 





SDK86 KEYPAD MONITOR 


CURRENT INSTRUCTION WORD. OPENS CS:IP FOR INPUT. 
COMMA CAUSES THE MONITOR TO SINGLE STEP THE INSTRUCTION, 
AND PERIOD TERMINATES THE COMMAND, %/ 


PROCEDURE; 


CALL КВЗИРОАТЕЗТР; 

ТЕ CHAR<>KBCOM THEN 

= CSIP.OFF; 

= CSIP.SEG; 

FL = FL OR STEP$TRAP; 
L ВЕЗТОКЕЗЕХЕСИТЕ; 


КВЗЕХАМЗМЕМ: 


/% IMPLEMENTS THE EXAMINE MEMORY COMMAND. 


GOTO ERROR; 


PAGE 12 


DISPLAYS IP AND THE 
DEPRESSINC 


/9 OPTIONAL CHANGE OF CS:IP #/ 


/9 SET TRAP FLAG BIT IN PSW а/ 


PROMPTS FOR AN 


ADDRESS AND THEN DISPLAYS THE BYTE OR WORD AT THAT LOCATION, 


IT THEN IS OPTIONALLY OPENED FOR INPUT. 


THE NEXT LOCATION. PERIOD TERMINATES. "/ 


PROCEDURE; 


DECLARE W WORD; 


CALL KBSBLANK$ADDR$FIELD(1); 


CALL КВЗОЕТЗСНАА; 


CALL KB$GETSADDR(@ARG1,CS,1); 
IF CHAR<>KBCOM THEN 


GOTO ERROR; 


DO WHILE TRUE; 
CALL KBSOUT$WORD( ARG1.OFF,ADDR$FIELD,0, BLANK) ; 
ЇР WORD$MODE THEN 
CALL KBSOUTSWORD( MEMORY $WORD$ARG1, DATASFIELD,1,NOBLANK) ; 


ELSE 


CALL КВЗООТЗВУТЕ( MEMORYS$ARG1,1); 
CALL KB$GET$CHAR; 
IF CHAR=KBPER THEN RETURN; 
IF CHAR<>KBCOM THEN 

IF WORD$MODE THEN 


IF СНАЯ=КВРЕЯ THEN 


DO; 
W з KB$SGETSEXPR(DATA$FIELD,1,NOBLANK); 


COMMA INCREMENTS 10 


/% PROMPT FOR ADDRESS ®/ 


79 GET ADDRESS 9/ 


/% CLEAR PROMPT */ 


IF (CHAR<>KBCOM) AND (CHAR<>KBPER) THEN GOTO ERROR; 


MEMORYSWORDSARG! з W; 


IF MEMORY$WORDSARG1<>W THEN GOTO ERROR; 


W = КВЗСЕТЗЕХРНА ( ОАТАЗВУТЕ, 1, МОВСАМК); 


ТЕ (CHAR<>KBCOM) AND (CHAR<>KBPER) THEN GOTO ERROR; 


MEMORYSARG1 = LOW(W); 
ТР MEMORY$ARG1<>LOW(W) THEN 
END; 


GOTO ERROR; 


RETURN; 


IF WORD$MODE THEN 
АВСТ,ОРР = АВСТ,ОРР + 2; 


ELSE 


ARG1.OFF = ARG1.OFF + 1; 


END; 
END; 


KBSEXAM$REG: 


/% IMPLEMENTS THE EXAMINE REGISTER COMMAND. 


PROMPTS FOR A VALID 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


0472 ЕВАОРЕ CALL KBOUTWORD 
012: 
88 5 CALL KB$GETS$CHAR; 
; STATEMENT # 88 
0475 E823FF CALL KBGETCHAR 
89 5 END; 
; STATEMENT # 89 
0478 ЕВСО JMP 992 
90 4 END; 
91 3 ТЕ ОРЕВеКВРІО5 THEN /* EVAL PREV OPER 8/ 
92 3 W = W + SAVE; 
; STATEMENT # 92 
013: 
ELSE 
93 3 Ч = Я - SAVE; 
; STATEMENT # 93 
ОЧТА А1ША00 MOV AX,SAVE 
0470 29064C00 SUB Я, АХ 
014: 
94 3 IF FIELD=DATA$BYTE THEN 
; STATEMENT # 94 
0481  ВОТЕОВЕЄ CMP ' BP]. .FIELD,OFFH 
0485 750C JNZ 815 
95 3 CALL KB$OUT$BYTE(LOW(W),PROMPTS); 
; STATEMENT # 95 
0487 А1%С00 MOV АХ, W 
ОЧВА 50 PUSH AX 5-2 
0488 FF7606 PUSH [ ВР] .РВОМРТЗ; 2 
ОЧВЕ ES44FE CALL KBOUTBYTE 
0491 ЕВ10 JMP @16 
015: 
ELSE 
96 3 CALL KB$OUT$WORD(W,FIELD,PROMPTS,BLANKING); 
; STATEMENT # 96 
0493 FF364C00 PUSH W 51 
0497 FF7608 PUSH [BP]).FIELD; 2 
ОЧУА FF7606 PUSH | ВР) „РЕОМРТЗ; 3 
0490 FF7604 РОЗН [BP].BLANKING; 4 
ОЧАО E872FE CALL KBOUTWORD 
016: 
97 3 IF CHAR=KBCOM ОК CHAR=KBPER ОК CHAR=KBCOL THEN 
; STATEMENT # 97 
ОЦАЗ AOSAOO MOV AL,CHAR 
ОЧАб 3С11 CMP AL,11H 
ОЧАВ BOFF MOV AL,OFFH 
O4AA 7401 JZ $+3H 
ОЧАС 40 INC AX 
O4AD 50 PUSH AX 1 
ОЧАЕ ВОЗЕ5АООТО СМР CHAR,10H 
0483 BOFF MOV AL,OFFH 
0485 7401 JZ $+3H 
0487 (40 INC AX 
0488 59 POP СЕ 51 
0489 ОАС1 OR AL, CL 
O4BB 50 PUSH AX е 1 
ОЧВС 803E5A0014 СМР CHAR, 14H 


ОЦС1 BOFF MOV AL,OFFH 


PL/M-86 COMPILER 


04С3 7401 JZ $+3H 
0465 340 ІМС АХ 
04С6 59 РОР Сї 
04С7 0АС1 OR AL,CL 
0469 -0008 АСА AL, 1 
04СВ 7305 JNB @17 
98 3 RETURN W; 
ОЧСО А14С00 MOV АХ, И 
0400 ЕВ2В ЈМР 82 
817: 
99 3 IF CHAR=KBPLUS OR CHAR=KBMINUS ТНЕМ 
0402 803Е5А0013 CMP CHAR,13H 
0407 BOFF MOV AL,OFFH 
0409 7401 JZ $+3H 
0408 40 INC AX 
очрс 50 PUSH AX 
0400 803Е5А0012 CMP CHAR,12H 
ОЧЕ2 BOFF MOV AL,OFFH 
OBEN 7:01 JZ 3-3Н 
0426 40 ЇНС АХ 
04Е7 59 РОР СХ 
08488 OAC! OR AL,CL 
ОЦВА 0008 АСА AL,1 
ОЦЕС 7203 JB $+5H 
ОЗЕЕ Е9СВЕС JMP ERROR 
100 3 OPER = CHAR; 
ОЦРІ АО5АОО MOV AL, CHAR 
ОЧРЧ А26300 MOV OPER, AL 
ELSE 
101 3 GOTO ERROR; 
102 3 CALL KB$GET$CHAR; 
ОЦЕТ бЕВАТРЕ CALL KBGETCHAR 
103 3 END; 
ОЦРА E9C6FE JMP 890 
#91: 
104 2 END; 
82: 
ОЧЕО 50 РОР ВР 
ОЧЕЕ 020600 RET 6H 
KBGETEXPR ENDP 
105 1 KBSGET$ADDR: 
IF NO SEGMENT [5 ENTERED, 
NUMBER OF PROMPTS SPECIFIED BY THE THIRD PARM, 
KBGETADDR PROC NEAR 
0501 55 PUSH BP 


/% THIS ROUTINE GATHERS CHARACTERS FROM THE INPUT STREAM 


SDK86 KEYPAD MONITOR 


we 
—_ 


; STATEMENT # 98 


; STATEMENT # 99 


51 


; STATEMENT 9 100 


/% GET NEXT CHAR 


; STATEMENT # 102 


; STATEMENT # 103 


; STATEMENT # 104 


; STATEMENT # 105 


PAGE 


е/ 


FORMS AN ADDRESS EXPRESSION OF SEGMENT PART AND OFFSET PART, 


THE FIRST CHARACTER HAS ALREADY BEEN READ INTO GLOBAL 
THE SECOMD PARM DEFAULT IS USED, 


"ОНАН". 


ТНЕ 


ADDRESS EXPRESSION IS DISPLAYED IN THE ADDRESS FIELD WITH THE 


PL/M-86 COMPILER 


358 
359 
360 


361 
362 


363 
364 
365 
366 
367 
368 
369 


370 


371 


372 
373 
37% 
376 
311 
318 
379 
380 
381 
382 
383 
384 
385 
389 
393 
397 


398 
399 
400 


401 
402 


403 


NNNNNMNNNNNN на са са са м 


— 


— 


SDK86 KEYPAD MONITOR PAGE 


OUTPUT(KB$STAT$PORT) = KB$INIT$SCAN; 
CALL KB$DISPLAY(@KB$SIGNON,ADDR$FIELD,0); /% SIGN ОМ MESSAGE #/ 
CALL KB$DISPLAY( @KB$VERSION, DATA$FIELD,0O); /% VERSION NUMBER #/ 


/# INITIALIZE USER'S REGISTERS #/ 
CS,SS,DS,ES,FL,IP = 0; 
SP = USER$INIT$SP; 


CALL INITSINT$VECTOR( @INT$VECTOR(1),. INTERRUPTIS$SENTRY); 

CALL LINIT$INTS$VECTOR( @INT$VECTOR(2),. INTERRUPT 3$ENTRY); 

CALL INIT$INT$VECTOR( @INT$VECTOR(3),. INTERRUPT3$ENTRY); 
BRKI$FLAG = FALSE; 

MONITOR$STACKBASE = 5ТАСКВА5Е; /% SAVE MONITOR STACK VALUES ®/ 
MONITOR$STACKPTR = STACKPTR; 

GOTO AFTER$ERROR; 


NEXT$COMMAND: 


/% 


THIS IS THE PERPETUAL COMMAND LOOP WHICH DISPATCHES ТО EACH 
COMMAND WHICH IS A SEPARATE PROCEDURE. #/ 


CALL KB$DISPLAY( @KB$CMND$PMT,ADDRS$FIELD,O); 


AFTER$ERROR: 


CALL KB$GET$CHAR; 
CALL KB$BLANK$ADDR$FIELD(0); 
CALL KB$BLANK$DATA$FIELD(0); 
ТЕ (LAST$COMMAND:=CHAR)>O9H THEN GOTO ERROR; 
WORD$MODE = FALSE; 
DO CASE CHAR; 

CALL КВЗЕХАМЗМЕМ; 

CALL КВЗЕХАМЗНЕС ; 

CALL KB$GO; 

CALL KB$SINGLE$STEP; 

CALL КВЗТМРИТ ; 

CALL KB$OUTPUT; 

CALL KB$MOVE; 


DO; WORD$MODE TRUE; CALL КВФЕХАМӚМЕМ; END; 


DO; WORD$MODE = TRUE; CALL КВУТМРИТ; END; 
DO; WORD$MODE = TRUE; CALL KB$OUTPUT; END; 
END; 
AFTER$COMMAND: 


ERROR: 
/% 


CALL KB$BLANK$DATA$FIELD(0); 
GOTO NEXT$COMMAND; 


THIS ROUTINE HANDLES ALL ERRORS DETECTED BY THE MONITOR AND WILL 
OUTPUT THE ERROR MESSAGE TO THE DISPLAY AND THEN JUMP TO 
"AFTER$ERROR' TO GET ANOTHER COMMAND, %/ 


CALL KB$DISPLAY( @KB$ERR$MSG,ADDR$FIELD,0O); 
CALL KB$BLANK$DATA$FIELD(0); 
GOTO AFTER$ERROR; 


AFTER$INTERRUPT: 


/а 


THIS ROUTINE CHECKS FOR THE LAST COMMAND WHEN THE MONITOR IS 
REENTERED VIA THE INTERRUPT VECTOR. %/ 


PL/M-86 COMPILER 


404 
405 
406 
407 


408 
409 
410 
411 
412 
413 
414 


415 


IF 





SDK86 KEYPAD MONITOR 


BRKI$FLAG THEN 

DO; 

MEMORY$BRK1 = BRKI$SAVE; 

BRKI$FLAG = FALSE; 

IF ((1Р-1) AND OOOFH)=(BRK1.0FF AND OOOFH) AND 

(SHR(IP-1,4)+CS)=(SHR(BRK1.0FF,4)+BRK1.SEG) THEN 

DO; 
IP = IP - 1; 
CALL KB$DISPLAY( @KB$BRK1,DATA$FIELD,0O); 
GOTO NEXT$COMMAND; 
END; 

END; 


GOTO AFTER$COMMAND; 


1 END MONITOR; /9 END OF MODULE #/ 


EOF 


MODULE INFORMATION: 


CODE AREA SIZE 
CONSTANT AREA SIZE 
VARIABLE AREA SIZE 
MAXIMUM STACK SIZE 
865 LINES READ 
О PROGRAM ERROR(S) 


0B82H 2946D 


= OOOOH OD 
= 0065H 1010 
з 0050Н 800 


END OF PLU/M-86 COMPILATION 


PAGE 


16 





| 50К-86 КЕУРАО МОМІТОВ 
яко | LJA EXPANDED SOURCE LISTING 
Ç 


P /M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 1 


ISIS-II PL/M-86 У1.0 COMPILATION OF MODULE MONITOR 

NO OBJECT MODULE REQUESTED 

COMPILER INVOKED BY: :F1:PLM86 :F1:KEYPAD.PLM LARGE OPTIMIZE(2) PAGEWIDTH(95) 4 
CODE XREF МООВЈЕСТ PRINT(:F1:KEYPAD.PRT) 


$TITLE(*SDK86 KEYPAD МОМІТОВ') 
! $NOINTVECTOR 


/9 пиво ооо ооо ооо ооо оно ооо ооо ооо ооо оо наа аа а ааа 
ооо 555555555555 5525 4 455555555555 ЛЛ 5 4445444, 


SDK-86 KEYPAD MONITOR, V1.1 
30 JUNE 1978 


(C) 1978 INTEL CORPORATION. ALL RIGHTS RESERVED. NO PART OF 
OF THIS PROGRAM OR PUBLICATION MAY BE REPRODUCED, TRANSMITTED, 
TRANSCRIBED, STORED IN A RETRIEVAL SYSTEM, OR TRANSLATED INTO ANY 
LANGUAGE, IN ANY FORM OR BY ANY MEANS, ELECTRONIC, MECHANICAL, 
MAGNETIC, OPTICAL, CHEMICAL, MANUAL OR OTHERWISE, WITHOUT THE PRIOR 
WRITTEN PERMISSION OF INTEL CORPORATION, 3065 BOWERS AVENUE, SANTA 
CLARA, CALIFORNIA, 95051. 


ABSTRACT 


ч THIS PROGRAM IS THE ROM BASED KEYPAD MONITOR FOR THE 50К-86. 
IT PROVIDES THE USER WITH A MODERATE LEVEL OF CAPABLILITY TO 
EXAMINIE/MODIFY MEMORY AND REGISTERS AND CONTROL PROGRAM EXECUTION. 
ENVIRONMENT 


THE SDK KEYPAD MONITOR COMMUNICATES WITH THE USER VIA THE ONBOARD 
KEYBOARD AND 7 SEGMENT DISPLAY. 


PROGRAM ORGANIZATION 


THE PROGRAM IS DIVIDED INTO 1 DATA AND 2 CODE MODULES: 


1. DATA DECLARATION MODULE. GLOBAL DATA DECLARATIONS. 
2. COMMON ROUTINES. LOWER LEVEL PROCEDURES 
| З. COMMAND MODULE. INDIVIDUAL COMMANDS AND OUTER BLOCK 
ы CALLING GRAPH 


>>COMMAND DISPATCH MODULE (OUTER BLOCK) 
INDIVIDUAL COMMAND PROCEDURES 
ч COMMON ROUTINES 


GLOBAL DATA STRUCTURES 


THE MONITOR MAINTAINS THE USER'S MACHINE STATE (REGISTERS) ТМ А 
WORD ARRAY. THE REGISTERS ARE SAVED FROM THE USER'S STACK 

AS PUSHED BY PLM86 INTERRUPT PROCEDURE. 

POINTERS TO THE SDK-86 2%%20 ADDRESS SPACE ARE IMPLEMENTED WITH 


PL/M=86 COMPILER 


У; 


/% 


"у 


50К86 KEYPAD MONITOR 


POINTER STRUCTURES ALLOCATED AS 2 WORD STRUCTURES. 


MONITOR: DO; /% BEGINNING OF MODULE #/ 


б8984804098585322482380923935305800884:23809929738999248008232:40230:34 32 86823290 2398 0 
ооо ооо ооо ооо вооон оо ооо ооо ооо оо ооо ооо оао соосо 


GLOBAL DATA DECLARATIONS MODULE 


ABSTRACT 
22222222 


THIS MODULE CONTAINS ALL THE GLOBAL DATA DECLARATIONS AND 
LITERALS (EQUATES). 


MODULE ORGAINIZATION 
2:222:2:222:222222222222 
THE MODULE IS DIVIDED INTO 5 SECTIONS: 
1. UTILITY SECTION GLOBAL FLAGS, VARIBLES, EQUATES 
2, 1/0 SECTION 
3. MEMORY ARGUMENTS SECTIONS 
4, REGISTER SECTION 
5. BOOT AND 8089 SECTION 


STRUCTURES FOR MEDIUM POINTERS 
USER REGISTER SAVE AREA 
BOOTSTRAP AND 8089 DESCRIPTOR 


1% 2220002 00 0 002 0000200020 


в UTILITY SECTION е 
099999492099290992888088/ 


2 1 DECLARE 


ІНТФУЄСТОВ( 5) POINTER; 


3 1 DECLARE 


MONITOR$STACKPTR WORD, 
MONITORS$STACKBASE WORD; 





1/0 PORTS,MASKS,AND SPECIAL CHARS 


/® INTERRUPT VECTORS %/ 


/% MONITOR SS SAVE ®/ 


PAGE 


4 1 DECLARE 
COPYRIGHT(®) BYTE DATA ('(C) 1978 INTEL CORP’); 

5 1 DECLARE 
BRKI$FLAG BYTE, /9 TRUE І? BREAK SET #/ 
BRKI$SAVE BYTE, /9 INST BREAK SAVE 9/ 
CHAR BYTE, /% ONE CHAR LOOK AHEAD %/ 
DISP(4) BYTE, 79 DISPLAY ARRAY %/ 
І BYTE, 
ЕМОЗОЕЕ WORD, /% END OFFSET ADDRESS 9/ 
WORD$MODE BYTE, 
LAST$COMMAND BYTE; 

DECLARE 

TRUE LITERALLY 'ОРРН’, 
FALSE LITERALLY ‘OOOH’, 
ADDRSFTIELD LITERALLY "1", /® ADDR FIELD WORD OUTPUT %/ 
ОАТАЗРТЕСО LITERALLY "0", /% DATA FIELD WORD OUTPUT %/ 
ОАТАЗВУТЕ LITERALLY "-1", /® DATA FIELD BYTE OUTPUT 9/ 
BLANK LITERALLY "1", 
NOBLANK LITERALLY "0", 
BREAK$INST LITERALLY "ОССН?, /% BREAKPOINT TRAP 9? / 
STEP$TRAP LITERALLY '0100Н', /9 SS TRAP FLAG MASK %/ 


2 


“ў 


6 


PL/M-86 COMPILER 


USER$INIT$SP 
GO$COMMAND 
SS$COMMAND 


SDK86 KEYPAD MONITOR 


LITERALLY 
LITERALLY 
LITERALLY 


'1008', 
"274 
“Зз 


/90889889088:08804088308888948282830890004 


1/0 DECLARATIONS SECTION 
0890800828988908898020894080808084888908808/ 


КВЗОТАТЗРОНТ 
КВФОАТАФРОВТ 
KB$INIT$MODE 


KB$INIT$SCAN 
KB$INRDY 
КВЗСМНОЗРМТ ( в) 
KB$SIGNON(*) 
КВЗУЕНЗТОН(#) 
КВЗНЕСЗРМТ (#) 
КВЗЕВАЗМ5О(8) 
КВЗЕХЕС( в) 
KB$BRK1(*) 
КВЗВЕАНКЗ ( *) 
LED(*) 


(3FH,06H,5BH,4FH, 66H, 6DH,7DH,07H, 
7FH,6FH,77H,7CH, 39H, 5EH, 79H, 71H); 


KBPER 
KBCOM 
KBREGKEY 
KBCOL 
KBPLUS 
KBMINUS 


LITERALLY 
LITERALLY 
LITERALLY 


LITERALLY 
LITERALLY 
BYTE DATA 
BYTE DATA 
BYTE DATA 
BYTE DATA 
BYTE DATA 
BYTE DATA 
BYTE DATA 
BYTE DATA 
BYTE DATA 


LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 


/409048098:58:80:0:9008:88880408: 


POINTER SECTION 


0208806909098889:80884886008088/ 


7 1 DECLARE 

8 1 DECLARE 
8 

3 1 DECLARE 


MEMORY$ARGI$PTR 


POINTER, 


ARG1 STRUCTURE (OFF WORD, 
АТ (@MEMORY$ARGI$PTR), 


MEMORY$ARG1 BASED MEMORY$ARGI$PTR BYTE, 
MEMORY$WORD$ARG1 BASED MEMORY$ARGI$PTR WORD, 


MEMORY АВС 3$ РТВ 


РОТМТЕЋ, 


ARG3 STRUCTURE (ОРЕ WORD, 
AT (@MEMORY$ARG3$PTR), 


MEMORY$ARG3 BASED MEMORY$ARG3$PTR BYTE, 


MEMORY$BRK1I$PTR 


POINTER, 


BRK1 STRUCTURE (OFF WORD, 
АТ (@MEMORYS$BRK1$PTR), 


MEMORY$BRK1 BASED MEMORY$BRKI$PTR BYTE, 


MEMORY$CSIP$PTR 


POINTER, 


CSIP STRUCTURE (OFF WORD, 


‘OFFEAH', 
"ОЕЕЕВН", 
"ООН", 


'39Н', 
"07Н", 


(ВОН, ООН, ООН, ООН), 
(ЗОН, ООН, 7ЕН, ТОН), 
(00H,00H,86H,06H), 
(50H,00H,00H,00H), 
(40Н,79Н,50Н,50Н), 
(79Н,ООН,ООН,ООН), 
(7СН,50Н,ООН,ООН), 
(ООН, ООН, оон,оон), 


"тон", 
'11Н', 
'15Н', 
"14Н", 
“13Н", 
"јен; 


SEG WORD) 


SEG WORD) 
SEG WORD) 


SEG WORD) 


/% USER STACK INITIAL #/ 
GO COMMAND CODE #/ 


/% 


/% STATUS/COMMAND PORT %/ 
/% DATA PORT %/ 


/% 


ЕМСОРЕ, 
1045 SCAN RATE 


/% 


8 8-ВІТ, 


РАСЕ 


LEFT ENTRY, 


2 KEY LOCKOUT #/ 


8 / 


IN CHAR RDY MASK #/ 


.. ' ./ 
.- 86" #/ 
ы 1 ° 1 Е # 
' R е жу 
"-БКИА" #/ 
"Е ` ./ 
"ВВ ' 8, 
, " ./ 


PERIOD 
COMMA 


REGISTER KEY 
COLON (SEGMENT) 


PLUS KEY 
MINUS KEY 


/9 ARGUMENT 1 2/ 


/ %4 


/ % 


/® 


BREAKPOINT 


ARGUMENT 3 #/ 


”/ 


CS:IP INSTRUCTION %/ 


3 


PL/M-86 COMPILER 


SDK86 KEYPAD MONITOR 


AT (@MEMORY$CSIP$PTR), 
MEMORY$CSIP BASED MEMORY$CSIP$PTR BYTE, 


MEMORY$USERSTACK$PTR POINTER, 


USERSTACK STRUCTURE (OFF WORD, 


АТ (@MEMORYSUSERSTACKS$PTR), 
MEMORYSUSERSTACK BASED МЕМОЯУЗОЗЕЯЗТАСКЗРТА WORD; 


/ 20022200 2020200002 0002225 


, REGISTER SECTION 


809080889989929992938928008/ 


DECLARE 
KB$REG( ®) 


(00H,77H,00H,7CH, ООН, 39H, ООН, SEH, 
6DH,73H,7CH, 73H, 6DH, ЗОН, 5EH, 30H, 
39Н,60Н,5ЕН,60Н,60Н,60Н,79Н,60Н, 
30H,73H,71H, 


REG$SAV(14) 
REGS$ORD( Ф) 


(7,6,1,3,2,0, 


BYTE DATA 


38H), 
WORD, 
BYTE DATA 


9.11,12.8, 


LITERALLI 
LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 
LITERALLY 


13), 

' ВЕСЗЗАУ( 
' ВЕСЗЗАУ( 
" АЕСЗЗАУ( 
"ВЕСЗЗАУ( 


79 USER'S STACK 


SEG МОВО) 


/% USER'S 


/9 STACKED REG ORDER 


4)", 
2 
8 
9 


'REG$SAV(11 
'REG$SAV( 12 
'REG$SAV(13 


/1830889488999099099029080892949923840989988282089 


Ч BOOTSTRAP JUMP AND 8089 VECTOR е 
ваввававав ово во ваа ааа аа ааа а аа ааа аа ее / 


)', 
к, 
У“ 
"ЯЕСУЗАУ( 10)", 
ж; 
2% 
) "3 


AXBXCXDX 
SPBPSIDI 
CSDSSSES 
IPFL 


SAVED REGS 


8 / 


”у 
* 7 
./ 
°/ 
# / 


./ 


/9 THIS BOOT CONSISTS OF A LONG JUMP TO THE BEGINNING OF THE MONITOR 


АТ ЕРОО+ХХХХ WHERE ХХХХ IS THE STARTING ADDRESS OFFSET (ІР) AND 


MUST BE DETERMINED AFTER EACH COMPILE. %/ 


DECLARE 


ЗТАВТЗАООН LITERALLY 


80071( е) 
80072( 8) 
800Т3(9) 


/% THIS TWO-WORD РАТА IS A JUMP 
АТ THE FIRST LOCATION OF ROM 
THE JUMP 15 


MAY PRECEDE IT). 


DECLARE 
BOOT4( ё) 


ие THIS BLOCK OF ROM АТ FPFF6-FFFFA IS INITIALIZED FOR THE 8089 
DEVICE AND POINTS ТО A BLOCK OF RAM AT LOCATION 100Н, %/ 


DECLARE 
BLOCK$8089 
BLOCK$8089$PTR 


WORD 


"009СН", 
BYTE АТ (OFFFFOH) 
WORD АТ (OFFFF1H) 
WORD AT (OFFFF3H) 


WORD DATA (ОЕЗ9ОН, ЗТАЯТЗАООН- 4); 


ОАТА (ОБАН), 
DATA ( ЗТАНТЗАООН), 
DATA (ОҒҒООН); 


79 STARTING ADDRESS ?/ 


е / 


АТ (OFFFF6H) DATA (000018), 


POINTER АТ (ОРРЕРЗН) DATA (00100H): 


/9 SEGMENT ADDRESS 


/% LONG JUMP OPCODE 9?/ 


8 / 


PAGE 


TO THE STARTING ADDRESS AND IS LOCATED 

(NO OTHER DATA OR CONSTANT DECLARATIONS 
ACTUALLY ТО (START=-ADDR)-4 SINCE THE 
INSTRUCTION IS A RELATIVE JUMP OF LENGTH 3, 


/9 NOP,JMP START-ADDR ?/ 


4 


«ў 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


/# оно оао ао и воина ааа аа вана наа ана аа ааа вана 
ооо ооо ооо ESE RE RES ERE EER ER ESE SERRE RES ER ERR ER EE ES SE е 


COMMON PROCEDURES 


THIS MODULE CONTAINS THOSE LOWER LEVEL PROCEDURES CALLED BY HIGHER 
LEVEL ROUTINES. 


MODULE ORGANIZATION 


THIS MODULE CONTAINS THE FOLLOWING SECTIONS: 
1, BASIC 1/0 SECTION 


KB$DISPLAY DISPLAY TO LED FIELDS 
KB$BLANK$DATA$FIELD BLANK DATA FIELD WITH PROMPTS 
KB$BLANK$ADDR$FIELD BLANK ADDRESS FIELD WITH PROMPTS 
КВ%00Т%5ВҮТЕ OUTPUT A BYTE ТО DISPLAY 
KBSOUT$WORD OUTPUT A WORD TO DISPLAY 
KB$GET$CHAR INPUT A CHAR FROM KEYPAD 

2. ARGUMENT EXPRESSION EVALUATOR 
KB$GET$EXPR GET WORD EXPRESSION 
KB$GET$ADDR GET ADDRESS EXPRESSION 
КВЗОРОАТЕ$ ТР СЕТ OPTIONAL CS:IP 

З, INTERRRUPT AND RESTORE/EXECUTE ROUTINES 
SAVE$REGISTERS SAVES USERS REGISTERS 
RESTORE$EXECUTE RESTORE MACHINE STATE AND EXEC 
INTERRUPRI$ENTRY INTERRUPT FOR SINGLE STEP 
INITERRUPT3$ENTRY INTERRUPT ROUTINE FOR GO 
INIT$INT$VECTOR INITIALIZES INTERRRUPT VECTORS 


./ 


А555152542Л44444444444.) 


8 BASIC I/O SECTION Ы 
ароросвввевовововововово / 


14 1 KB$DISPLAY: 
; STATEMENT # 14 
/% THIS ROUTINE DISPLAYS THE CONTENTS OF THE ARRAY POINTED TO BY 
THE FIRST PARM TO THE FIELD SPECIFIED BY THE SECOND (ADDR OR 
DATA). THE NUMBER OF DECIMAL POINTS OR PROMPTS IS DETERMINED 
BY THE THIRD PARAMETER #/ 


KBDISPLAY PROC NEAR 
0251 55 PUSH BP 
0252 8BEC MOV BP,SP 
PROCEDURE (PTR,FIELD,PROMPTS); 
15 2 DECLARE PTR POINTER, (FIELD,PROMPTS,T) BYTE, 
DISPLAY BASED PTR (1) BYTE; 
16 2 ТЕ FIELD=ADDR$FIELD ТНЕМ 
; STATEMENT # 16 
0254 807Е0601 СМР [BP].FIELD,1H 
0258 7507 JNZ 81 
17 2 OUTPUT(KB$STAT$PORT) = 94H; /% ADDRESS FIELD #/ 


; STATEMENT # 17 
025А BAEAFF MOV ОХ, ОЕЕЕАН 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


29 


21 


23 


28 


25 


26 


0250 8091 МОУ AL,95H 
025Р 2805 JMP 8103 

01: 

ELSE 
ОЧТРОТ (КВЗЗТАТЗРОЯТ) = 90H; /9 DATA FIELD #/ 
; STATEMENT 8 18 

0261 BAEAFF MOV DX,OFFEAH 
0264 8090 MOV AL,90H 

2103: 
0266 EE OUT DX 


DO 1:0 TO 3; 
; STATEMENT # 19 


0267 алсдаа MOV І,ОН 
982: 
026С 803Е5Ғ0003 СМР Жа ЗИ 
0271 17730 ЈА 983 
T = DISPLAY(3-I); /9 DISPLAY BACKWARDS! #/ 
; STATEMENT # 20 
0273 8003 MOV AL, ЗН 
0275 24065РОО SUB AL, I 
0279 8400 мо“ АН, ОН 
0278 8966 MOV ЗТ, АХ 
0270 C45E08 LES ВХ,ГВР].РТЯ 
0280 268408 MOV СЬ,ЕЗ: (ВХ ] DISPLAY{ 31) 
0283 8806200 МОУ T,CL 


IF PROMPTS>I THEN T з T OR 80H; 
; STATEMENT Ф 21 


0287 8А4604 MOV Ам, ВР] .РАОМРТЗ 
028A 3А065РОО СМР AL, I 
028Е 7605 ЈВЕ 83 | 
; ЗТАТЕМЕНТ # 22 
0290 800Е620080 OR T, 89H 
23: 


OUTPUT(KBSDATAS$PORT) = T; 
; ЗТАТЕМЕНТ # 23 


0295 ЗАЕВРР MOV ОХ, ОРРЕЗН 
0298 А06200 МОУ AL,T 
0298 EE OUT DX 
END; 
; STATEMENT # 24 
0296 80065F0001 ADD 1,18 
02А1 7569 JNZ 882 
883: 
END; 
; STATEMENT Ф 25 
02А3 5D POP BP 
0244 С20800 RET 8H 
KBDISPLAY ENDP 
KBSBLANKS$DATASFIELD: 


; STATEMENT # 26 
/8 THIS ROUTINE BLANKS THE DATA FIELD OF THE DISPLAY WITH THE 
NUMBER OF PROMPTS (DECIMAL POINTS) AS SPECIFIED BY THE PARAMETER. "/ 


KBBLANKDATAFIELD PROC NEAR 
02А7 55 PUSH BP 
0248  8ВЕС MOV BP,SP 


PROCEDURE( PROMPTS) ; 


6 





PL/M-86 COMPILER 


27 2 DECLARE PROMPTS BYTE; 
28 2 CALL KB$DISPLAY( @£BS$BLANKS, DATA$FIELD, PROMPTS); 
; STATEMENT # 28 
О2АА 2Е8р063700 LEA AX,CS:KBBLANKS 
О2АЕ ОЕ PUSH С5 ‚4 
0280 59 PUSH AX : 2 
0281 8000 MOV AL,OH 
02B3 50 PUSH AX : 3 
0284 FF7604 PUSH СВР | ,РКОМРТ5: 4 
0287 E897FF CALL KBDISPLAY 
29 2 END; 
; STATEMENT # 29 
O2BA 5D POP BP 
0288 С20200 КЕТ 2H 
KBBLANKDATAFIELD ENDP 
30 KB$BLANK$ADDR$FIELD: 
; STATEMENT # 30 | 
/® THIS PROCEDURE BLANKS THE ADDRESS FIELD: OF THE DISPALY WITH THE 
NUMBER OF PROMPTS SPECIFIED BY THE PARAMETER 'РАОМРТ5'. 8/ 
KBBLANKADDRFIELD PROC NEAR 
028Е 55 PUSH BP 
O2BF  ЗВЕС MOV BP,SP 
| PROCEDURE(PROMPTS); 
31 ë DECLARE PROMPTS ВУТЕ; 
32 2 CALL KB$DISPLAY( @KB$BLANKS, ADDR$FIELD, PROMPTS); 
; STATEMENT # 32 
02C1 2£8D063700 LEA AX,CS:KBBLANKS 
02С6 ОЕ PUSH cs : 4 
9267 50 PUSH AX ; 2 
02C8 8001 MOV AL,1H 
02СА 50 PUSH AX : 3 
02СВ FF7604 PUSH (BP].PROMPTS; Ч 
02СЕ ЕВВОЕЕ CALL KBDISPLAY 
33 2 END; 
; STATEMENT # 33 
02D1 5D POP BP 
0202  с20200 RET 2H 
KBBLANKADDRFIELD ENDP 
34 1 KBSOUT$BYTE: 
; STATEMENT # 34 
/* THIS ROUTINE OUTPUTS THE BYTE INPUT FROM THE FIRST PARAMETER 
TO THE DATA FIELD WITH THE NUMBER OF PROMPTS SPECIFIED BY THE 
SECOND PARAMETER, #/ 
KBOUTBYTE PROC NEAR 
0205 55 PUSH BP 
0206 8BEC MOV BP,SP 
PROCEDURE(B,PROMPTS); 
35 2 DECLARE (B,PROMPTS) BYTE; 
36 2 DISP(0),DISP(1) = 0; /* FIRST TWO BLANK #/ 
; STATEMENT # 36 
02D8 8000 MOV AL,OH 
O2DA A25B00 MOV DISP,AL 
0200 A25C00 MOV DISP+1H,AL 
37 2 DISP(2) = LED(SHR(B,4) AND OFH); 


SDK86 KEYPAD MONITOR 


; STATEMENT # 37 


PAGE 


7 


PL/M-86 COMPILER 


SDK86 KEYPAD MONITOR 


02Е0 8А5ЕО06 MOV BL,.BP].B 
02Е3 B104 MOV CL,4H 
02Е5 D2EB SHR BL,CL 
02Е7 80E30F AND BL,OFH 
02ЕА 8700 MOV BH,OH 
02ЕС 2ES8A4F3B MOV 012,05: 0 ВХ] 
02РО 88085000 MOV DISP+2H,CL 
38 2 DISP(3) = LED(B AND ОРН); 
; STATEMENT # 38 
О2Рц 8AS5E06 MOV BL,: ВР). В 
0277 80ЕЗОР AND BL,OFH 
О2РА 8700 MOV BH,OH 
O2FC 2E8A4F3B MOV CL,CS:LED[ ВХ) 
0300 880Е5Е00 MOV DISP+3H,CL 
39 2 CALL KB$DISPLAY( @DISP, DATA$FIELD, PROMPTS); 
; STATEMENT # 39 
0304 800Е5В00 LEA CX,DISP 
0308 1Е PUSH 03 ; 1 
0309 51 PUSH СХ Ж. 
030А 50 РОЗН АХ : 3 
0308 FF7604 РОЗН IBP].PROMPT3; 4 
ОЗОЕ ЕВЦОРЕ CALL KBDISPLAY 
40 2 END; 
; STATEMENT # 40 
0311 5D POP BP 
0312 С20400 RET UH 
KBOUTBYTE ENDP 
44 1 KBSOUT$WORD: 
; STATEMENT # 41 
/® THIS ROUTINE OUTPUTS THE FIRST PARM TO THE FIELD SPECIFIED 
BY THE SECOND WITH THE NUMBER OF PROMPTS SPECIFIED BY THE THIRD. 
LEADING ZERO BLANKING IS PERFORMED IF SPECIFIED BY THE FOURTH 
PARAMETER, %/ 
KBOUTWORD PROC NEAR 
0315 55 PUSH BP 
0316 ЗВЕС MOV BP,SP 
PROCEDURE(W,FIELD, PROMPTS, BLANKING); 
42 2 DECLARE W WORD, (FIELD,PROMPTS,BLANKING) BYTE; 
43 2 DO 1:0 TO 3; 
; STATEMENT # 43 
0318 С6065Ғ0000 MOV 1,0Н 
884: 
0310 803E5F0003 СМР 1,3Н 
0322 7729 ЈА 285 
цц 3 DISP(I) = LED(SHR(W,(3-1)*4) AND OOOFH); 
; STATEMENT # 44 
0324 B003 MOV AL, ЗН 
0326 2A065F00 SUB AL,I 
0324 8104 MOV CL,4H 
032C F6E1 MUL СЕ 
0328 8961 MOV Cx, АХ 
0330 8BSEOA MOV ВХ, BP]. W 
0333  ОЗЕВ SHR BX,CL 
0335 81E30F00 AND ВХ, ОЕН 
0339 2Е8А4738 MOV AL,CS: LEDS BX] 
0330 ВА1Е5200 MOV BL,I 


PAGE 


8 


PL/M-86 COMPILER 


0341 
0343 
45 3 


0346 
0348 


46 2 


0340 
0351 
47 
48 


“ Г 


0353 
49 3 


0358 
0356 
035Е 
0362 
0364 
0366 
0367 
0363 
0368 
0360 
036Ғ 
0370 
0371 
0373 
0375 
50 4 


0377 
0378 
0370 


0381 
52 ц 


0386 
23 3 


54 2 


0388 

038C 

038D 

ОЗВЕ 

0391 

0394 
55 2 


0397 


SDK86 KEYPAD MONITOR 


ВН, ОН 
DISP, ВХ), АГ, 
; STATEMENT 
1,18 
084 


; ЗТАТЕМЕНТ 
[BP].BLANKING,1H 
94 


; STATEMENT 
Т, ОН 
ЗЕН AND І<3; 

; ЗТАТЕМЕМТ 


BL, I 

ВН,ОН 

ОТЗР[ ВХ], ЗЕН 
АС, ОРРН 

$+3H 

AX 


; STATEMENT 
BL, T 
ВН, ОН 
ОТ5Р ВХ] ‚ОН 


; STATEMENT 


; ЭТАТЕМЕМТ 


CALL KB$DISPLAY(@DISP,FIELD, PROMPTS); 


; STATEMENT 
AX,DISP 
DS : 1, 
АХ к 


2 
[ВР] РТЕБО; 3 
| ВР]. РНОМРТ5; 4 
KBDISPLAY 


; STATEMENT 
BP 


B700 MOV 
884758 MOV 

END; 
80065F0001 ADD 
75D0 JNZ 

885: 

ТЕ BLANKING=BLANK THEN 
807E0401 CMP 
7939 542 

ро; 
L я 0; 
С6065Ғ0000 MOV 
DO WHILE РІЗР(І) = 
086: 
ВА 1ЕБЕОО МОУ 
8700 MOV 
807Е5ВЗЕ СМР 
BOFF MOV 
7401 JZ 
40 INC 
50 PUSd 
80FB03 CMP 
BOFF MOV 
7201 JB 
40 INC 
59 POP 
2201 AND 
0008 АСА 
7311 JNB 
DISP(I) з 0; 
8A1E5F00 MOV 
B700 MOV 
C6475B00 MOV 
I з + 1; 
80065ЕОООТ ADD 
END; 
EBDO JMP 
END; 
0%: 
8D065B00 LEA 
1E PUSH 
50 PUSH 
ЕЕ7608 РЈ5Н 
FF7606 PUSH 
ЕЗВАЕЕ CALL 
END; 
50 РОР 


РАСЕ 


# 45 


/а BLANK LEADING O'S %/ 
# 46 


PL/M-86 COMPILER 


56 


87 


59 


50 


61 


62 


~ 


0398 


0398 
9396 


09398 
ОЗА 1 
ОЗА2 
03А% 


0346 
ОЗА9 
ОЗАВ 


ОЗАС 
ОЗАР 
9380 


0383 
0384 





SDK85 KEYPAD MONITOR PAGE 
С20800 АЕТ 8H 
KBOUTWORD ENDP 
КВЗСЕТЗСНААЯ: 
| ; STATEMENT # 56 
/® READS ONE CHARACTER FROM THE FIFO OF THE 8279. WAITS UNTIL 
CHARACTER IS AVAILABLE AND THEN RETURNS THE CHARACTER IN GLOBAL 
VARIABLE "СНАА", 9/ 
КВСЕТСЧАЯ PROC NEAR 
55 РОЗН ВР 
8BEC MOV BP,SP 
PROCEDURE; 
DO WHILE (INPUT(KB$STATSPORT) AND KBSINRDY)=20; END; 
; STATEMENT 9 57 
888: 
BAEAFF MOV ОХ, ОЕРЕАН 
EC IN DX 
4807 TEST AL, ТН 
74 а 42 888 
001Р07(К335ТАТ3РОХНТ) = 0408; / 9 ENABLE INPUT DATA ?/ 
: STATEMENT # 59 
BAEAFF MOV DX,OFFEAH 
8040 MOV AL, ВОН 
ЕЕ OUT DX 
CHAR з ТМРОТ(КВЗОАТАЗРОВТ); /9 READ CHARACTER #/ 
; STATEMENT # 60 
ВАЕЗЕР MOV ОХ, ОРРЕЗН 
ЕС ІМ DX 
A25A00 МОУ CHAR,AL 
END; 
: STATEMENT # 51 
50 РОР ВР 
C3 RET 
KBGETCHAR ENDP 
99 ее ео я ооо оо ава во ваа а даваа аа ааа ааа аа ааа .. 
, ARGUMENT EXPRESSION EVALUATOR SECTION • 
да 0998234899929994292999999898999999928909999998006/ 
KBSGETSEXPR: 
: STATEMENT # 52 
/® THIS ROUTINE GATHERS CHARACTERS FROM THE INPUT STREAM 
AND FORMS A WORD EXPRESSION WHICH 15 RETURNED AS THE VALUE 
OF THE PROCEDURE. THE CHARACTERS INPUT ARE ECHOED TO THE 
ADDRESS OR DATA FIELD AS SPECIFIED BY THE FIRST PARAMETER. 
IF THE FIRST PARM IS 0 (ADDR) OR 1 (DATA) THEN THE EXPRESSION ІЗ 
OUTPUT AS А WORD AND IF -1 (DATA$8YTE) THEN АЗ A BYTE ALWAYS IN 
DATA FIELD. THE NUMBER OF PROMPTS ВУ THE SECOND PARM, AND LEADING 
ZERO BLANKING ВУ THE THIRD. EXPRESSION ARE TERMINATED WITH 
A COMMA,PERIOD OR COLON. 'CHAR' WILL CONTAIN ONE OF THESE 
ON EXIT. #/ 
KBGETEXPR PROC NEAR 
55 РЈ5Н ВР 
8BEC MOV ВР, 5? 
PROCEDURE (FIELD,PROMPTS,SLANKING) WORD; 
DECLARE (FIELD,PROMPTS,3LANKING) BYTE, 


10 


PL/M-86 COMPILER 


64 2 


0388 
65 2 


03BD 
66 2 


67 3 


03C3 
03С8 
68 
69 


ық» 


03СА 

03СҒ 

0300 

0301 

0304 

0307 
70 4 


O3DA 
71 4 


03DD 

03E2 

O3E4 
73: 24 


0327 

ОЗЕВ 

ОЗЕР 

ОЗЕР 

03Е2 
74 4 


0325 
03F9 
1.5 4 


03FB 
ОЗРЕ 
ОЗЕР 
0402 
0405 


76 4 


0407 
0408 
O40E 
0411 


SDK86 KEYPAD MONITOR 


(SAVE,W) WORD, OPER BYTE; 
OPER = KBPLUS; 
STATEMENT # 64 


ғ ; 
С606630013 MOV OPER, 13H 
W = 0; 
; STATEMENT # 55 
C7064C000000 MOV и, ОН 


DO WHILE TRUE; 
STATEMENT # 66 


@90: 
ТЕ CHAR=KBREGKEY THEN 
; STATEMENT # 67 
803E5A0015 CMP CHAR, 15H 
7560 JNZ 85 


ро; /% REGISTER NAME #/ 
CALL KB$DISPLAY( @KB$REG$PMT,FIELD,PROMPTS); 


; STATEMENT # 69 


2Е80062700 LEA AX,CS:KBREGPMT 
ОЕ PUSH CS 2-3 

50 PUSH AX а 
ЕЕ7608 PUSH [BP].FIELD; 3 
FF7606 PUSH [BP].PROMPTS; 4 
E877FE CALL KBDISPLAY 


CALL KB$GET$CHAR; 
; STATEMENT # 70 
ЕЗВЕРЕ CALL KBGETCHAR 
IF CHAR>ODH THEN GOTO ERROR; 
; STATEMENT # 71 


803E5A000D CMP CHAR,ODH 
7603 JBE $+5H 
E9D5FD JMP ERROR 


SAVE = REG$SAV(CHAR); 
; STATEMENT # 73 


8A1E5A00 MOV BL,CHAR 

B700 MOV ВН,ОН 

D1E3 SHL ВХ, 1 

88472Е MOV AX, REGSAV[ BX] 


A34A00 MOV SAVE, АХ 
IF FIELD=DATA$BYTE THEN 
; STATEMENT # 74 
ВОТЕОВЕЕ СМР [BP].FIELD,OFFH 
750С JNZ ет 
CALL KB$OUT$BYTE(LOW(SAVE),PROMPTS); 
; STATEMENT # 75 


A14A00 MOV AX,SAVE 
50 PUSH AX 421 
РЕТ606 PUSH [ ВР] ,РВОМРТ5, 2 
E8DOFE CALL KBOUTBYTE 
EB10 JMP е8 
ет: 
ELSE 


CALL KB$OUT$WORD(SAVE,FIELD,PROMPTS, BLANKING); 


: STATEMENT # 76 
FF364A00 PUSH SAVE : 4 
FF7608 PUSH [ ВР] FIELD; 2 
FF7606 PUSH [ ВР] .РВОМРТЗ; 3 
ЕЕ7604 PUSH ІВРІ.В,АМКІМС; 4 


/% INVALID REG KEY #/ 


PAGE 


11 


PL/M-86 COMPILER 


0414 
ТТ 4 


0817 
78 ц 


041A 
O41F 
0421 
0424 
0428 


79 
80 


=> 


O42A 

082Е 

0831 
82 4 


0434 
83 ц 


ОЧЗА 
O43F 
84 5 


0441 
0444 
0446 
0448 
O44C 
ОЦЦЕ 
0450 
85 5 


0453 
0457 
86 9 


0459 
ОЦБС 
0450 
0460 
0463 


87 5 


0465 
0469 
O46C 
O46F 


TOR 


KBOUTWORD 


ТЭСНАВ; 


КВСЕТСНАВ 


OPER, 13H 
813 
AX,SAVE 
W,AX 
014 


Н ТИЕН СОТО ERROR; 


CHAR,OFH 
$+5H 
ERROR 


ЗАТЕ, ОН 
HAR<=0FH; 


CHAR, ОРН 
06 


. 
? 


STATEMENT # 77 


STATEMENT # 78 


/% NUMBER #/ 
/9 INVALID DIGIT #/ 


ЗТАТЕМЕКТ # 80 


ЗТАТЕМЕНТ # 82 


STATEMENT # 83 


SHL(SAVE,4) + DOUBLE( СНАЯ); 


AX,SAVE 
CL,4H 
АХ, СТ, 
CL,CHAR 
СН, ОН 
АХ, СХ 
ЗАУЕ, АХ 


STATEMENT # 84 


ТЕ FIELD=DATA$BYTE THEN 


CALL KBSOUTSBYTE(LOW( SAVE) ,PROMPTS); 


SDK86 KEYPAD MONI 
ЕЗРЕРЕ CALL 
88: 

CALL KB$GE 
ЕВ881РР CALL 

END; 

86: 
803Е630013 СМР 
1559 JNZ 
A14A00 MOV 
01064C00 ADD 
EBS7 JMP 

85: 

ELSE 

DO; 

ІР CHAR>OF 
803E5A000F CMP 
7603 JBE 
E988FD JMP 

SAVE = 0; 
C7064A000000 MOV 

DO WHILE C 

992: 
803Е5А000Ғ СМР 
7709 ЈА 

ЗАМЕ = 
A14A00 MOV 
B104 MOV 
D3E0 SHL 
ВАОЕБАОО MOV 
B500 MOV 
03С1 ADD 
АЗЦАОО MOV 
ВОТЕОВРЕ СМР 
750C JNZ 
A14A00 MOV 
50 PUSH 
FF7606 PUSH 
Е8Т2ҒЕ CALL 
ЕВ10 4МР 

911: 

ELSE 
CALL 
FF3Z64A00 PUSH 
FF7608 PUSH 
FF7606 PUSH 
FF7504 PUSH 


STATEMENT # 85 


[BP].FIELD,OFFH 


811 


AX,SAVE 
АХ 


812 


KB$OUT$WORD(SAVE,FIELD,PROMPTS,BLANKTING); 


SAVE 


. 
, 


. 
, 


STATEMENT # 86 


1 


{Г ВР] .РВОМРТЗ; 2 
KBOUTBYTE 


STATEMENT # 87 
1 


[BP].FIELD; 2 
[BP].PROMPTS; 3 
I ВР] .ВЕАМКТМС; 4 


РАСЕ 


PL/M-86 COMPILER 


262 
263 
264 
265 
267 
268 
269 
270 
271 
272 
273 
274 
215 
275 
277 
278 
280 
281 
282 
284 
285 
286 


287 


288 
289 
290 
291 
293 
294 
295 
296 
298 
300 
301 
302 
303 
305 


306 
308 
310 
311 
312 
313 


314 


- Әс £ ЕБЕ ГА АА ХА 2) цд) АА а) Г № Г ГО № ГО 


мере еее 


NNN мо № м 


—^ 


SDK86 KEYPAD MONITOR 


REGISTER KEY AND DISPLAYS THE VALUE OF THAT RECTSTER WHICH IS 
OPTIONALLY OPENED FOR INPUT. COMMA INCREMENTS TO NEXT REGISTER 
UNLESS ІТ IS "ЕП," WHICH TERMINATESS AS DOES PERIOD. %/ 


PROCEDURE; 


DECLARE I BYTE, SAVE WORD; 
CALL KB$BLANK$ADDRS$FIELD(1); 
CALL KB$GETS$CHAR; 
IF CHAR>ODH THEN GOTO ERROR; 
I = CHAR; 
DO WHILE TRUE; 
DISP(0),DISP(1) = O; 
DISP(2) = КВ9ВЕС(1%2); 
DISP(3) = KB$REG(I82+1); 
CALL KB$DISPLAY(ODISP,ADDR$FIELD,O); 
CALL KB$OUT$WORD(REG$SAV(I),DATA$FIELD,1,NOBLANK); /% VALUE #/ 
CALL KB$GET$CHAR; 
ТЕ CHAR<>KBCOM AND CHAR<>KBPER THEN 
DO; 
SAVE = KB$GET$EXPR(DATA$FIELD,1,NOBLANK); /% UPDATE #/ 
IF CHAR<>KBCOM AND СНАК<>КВРЕН THEN GOTO ERROR; 
REG$SAV(I) = SAVE; 


/% INVALID REG KEY */ 


/8 DISPLAY REG NAME #/ 


END; 
ТЕ СНАН-КВРЕН OR 1213 THEN RETURN; /а DONE? %/ 
I = I + 1; 
ЕМО; 
END; 
KB$MOVE: 


/% IMPLEMENTS THE MOVE COMMAND. PROMPTS FOR 3 ARGUMENTS AND MOVES 


THE BLOCK OF MEMORY SPECIFIED BY ARG1-ARG2 ТО ARG3, IF THERE 15 
A DIFFERENCE WHEN READ BACK, THEN ERROR. #/ ` 


PROCEDURE; 


CALL KB$BLANK$ADDR$FIELD(3); /* FIRST ARGUMENT %/ 
CALL KB$GET$CHAR; 

CALL KB$GET$ADDR( @ARG1,CS, 3); 

IF CHAR<>KBCOM THEN GOTO ERROR; 

CALL KB$BLANK$ADDR$FIELD(2); 

CALL KB$GET$CHAR; 

END$OFF = KB$GET$EXPR( ADDR$FIELD,2, BLANK); 
IF END$OFF<ARG1.0OFF THEN GOTO ERROR; 
IF CHAR<>KBCOM THEN GOTO ERROR; 

CALL KB$BLANK$ADDR$FIELD(1); 

CALL KB$GET$CHAR; 

CALL KB$GET$ADDR(@ARG3,ARG1.SEG,1); 
ТЕ СВАВ«>КВРЕН THEN GOTO ERROR; 


/% SECOND ARGUMENT %/ 


/% THIRD ARGUMENT #/ 


LOOP: 
MEMORY$ARG3 = MEMORY$ARG1; 
ТЕ MEMORY$ARG3<>MEMORY$ARG1 THEN GOTO ERROR; 
IF ARG1.OFF = END$OFF THEN RETURN; 
ARG1,OFF = АНС1,ОЁР + 1; 
ARG3.OFF = ARG3.OFF + 1; 
GOTO LOOP; 
END; 
КВЗТНРИТ: 


/% PROMPTS FOR A PORT WORD IN THE ADDRESS FIELD. WHEN A COMMA 


IS ENTERED THE BYTE OR WORD Т5 DISPLAYED IN THE DATA FIELD. 





Р,/М-86 COMPILER 50К86 KEYPAD MONITOR PAGE 14 


THIS MAY BE REPEATED FOR MULTIPLE READING OF THE PORT. PERIOD 
TERMINATES THE COMMAND. %/ 


PROCEDURE; 
315 2 DECLARE PORT WORD; 
316 2 CALL KB$BLANK$ADDRS$FPIELD(1); /% PROMPT FOR PORT #/ 
317 2 CALL КВ%СЕТ9СНАН; 
318 2 PORT = KB$GETSEXPR(ADDRSFIELD,1,BLANK); /% GET PORT NUMBER 9/ 
319 2 CALL KB$OUTSWORD(PORT,ADDR$FIELD,0O,BLANK); /% REMOVE PROMPT #/ 
320 2 LOOP: 
IF CHAR<>KBCOM THEN СОТО ERROR; 
322 2 IF WORD$MODE THEN 
323 2 CALL KB$SOUTS$WORD( INWORD( PORT) ,DATA$FIELD,0,NOBLANK); 
ELSE 
324 2 CALL КВЗОПТЗВУТЕ( INPUT( PORT) ,0); 
425 2 CALL КВЗОБТЗСНАА; 
326 2 IF CHAR=KBPER THEN RETURN; 
328 2 GOTO LOOP; 
329 2 END; 
330 1 КВЗОПТРИТ: 
/8 PROMPTS FOR A PORT WORD IN THE ADDRESS FIELD AND A BYTE ОН 
WORD DATUM IN THE DATA FIELD. THIS DATUM [5 OUTPUT A SINGLE TIME 
TO THE SPECIFIED PORT. %/ 
PROCEDURE; 
331 2 DECLARE (DATUM,PORT) WORD; 
332 2 CALL KB$BLANK$SADDRS$FIELD(1); /9 PROMPT FOR PORT #/ 
333 2 CALL КВЗСЕТУСНАВ; 
334 2 PORT = KB$GETSEXPR(ADDRS$FIELD,1,BLANK); 
212 2 ТЕ CHAR<>KBCOM THEN GOTO ERROR; 
337 2 CALL KB$OUT$WORD(PORT,ADDR$FIELD,O,BLANK); /% REMOVE PROMPT %/ 
338 2 CALL KB$BLANK$DATA$FIELD(1); /9 PROMPT FOR DATUM %/ 
339 2 CALL КВЗСЕТЗСНАЯ; 
340 2 LOOP: 
ТЕ WORDSMODE THEN 
341 2 DATUM = KBS$GETSEXPR(DATASFIELD,1,NOBLANK); /% GET DATUM WORD #/ 
ELSE 
342 2 DATUM = KBSGETSEXPR(DATASBYTE,1,NOBLANK); /% GET DATUM BYTE 9/ 
343 2 IF CHAR=KBCOL THEN GOTO ERROR; 
345 2 IF WORD$MODE THEN 
346 2 OUTWORD( PORT) = DATUM; 
ELSE 
347 2 OUTPUT( PORT) = LOW{ DATUM); 
348 2 IF СНАН-КВСОМ THEN /% MULTIPLE OUTPUTS #/ 
349 2 DO; 
350 3 CALL КВЗВСАНКЗОАТАФЕТЕ.0( 1); 
351 3 CALL KB$GET$CHAR; 
352 3 ТЕ СНАН<С>КВРЕЋ THEN GOTO LOOP; 
354 3 END; 
355 2 END; 
(048488888089989988992992220899239924999999894 
• COMMAND DISPATCH MAIN PROGRAM LOOP • 
010000020000 0000 000002 0008 00000000 20000 01200120200 
356 1 DISABLE; 


22! 1 ОПТРОТ( КВЗЗТАТЗРОНТ) = КВЗТМТТЗМООЕ; /% INIT 8279 %/ 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


0502  ВВЕС MOV BP,SP 
PROCEDURE( PTR, DEFAULT$BASE, PROMPTS); 
106 2 DECLARE PTR POINTER, DEFAULT$BASE WORD, PROMPTS BYTE, 
ARG BASED PTR STRUCTURE (OFF WORD, SEG WORD); 
107 2 ARG.SEG = DEFAULT$BASE; 
; STATEMENT # 107 
0504 884606 MOV AX,i1BP).DEFAULTBASE 
0507 C4S5E08 LES ВХ,ІВРІ.РТВ 
0504 26894702 MOV ES: ААС! ВХ-2Н),АХ 
108 2 ARG.OFF = KB$GET$EXPR( ADDR$FIELD, PROMPTS, BLANK); 
: STATEMENT # 108 
050Е 8001 MOV AL, 1H 
0510 50 PUSH AX ; 1 
0511 FF7604 PUSH | ВР] „РВОМРТЗ; 2 
0514 50 РИЗН АХ : 3 
0515 E89DFE CALL KBGETEXPR 
0518 C45E08 LES ВХ, ВР].РТВ 
0518 268907 MOV ЕЗ:АВСІВХІ,АХ 
109 2 ТЕ CHAR=KBCOL ТНЕН /% SEGMENT SPEC'D 8/ 
; STATEMENT # 109 
051E 803Е5А0014 CMP CHAR, 14H 
0523 7527 JNZ его 
110 2 ро; 
111 3 CALL KB$GET$CHAR; 
; STATEMENT # 111 
0525 E873FE CALL KBGETCHAR 
112 3 ARG.SEG = ARG.OFF; 
; STATEMENT # 112 
0528 C45E08 LES ВХ,ІВРІ,РТА 
0528 268807 MOV AX, ES: ARG[ ВХ) 
052Е 26894702 MOV ES: АВС! BX+2H] ‚АХ . 
113 3 ARG.OFF = KB$GET$EXPR(ADDR$FIELD,PROMPTS, BLANK); 
; STATEMENT # 113 
0532 B001 MOV AL, 1H 
0534 50 PUSH AX ; 1 
0535 FF7601 PUSH IBP].PROMPTS; 2 
0538 50 PUSH AX ; 
0539 E879FE CALL КВСЕТЕХРА 
053С  СЦ5ЕО8 LES ВХ,ІВРІ,РТВ 
0532 268907 МОУ ES:ARGIBX],AX 
114 3 ТЕ CHAR=KBCOL THEN GOTO ERROR; 
: STATEMENT # 114 
0542 803E5A0014 CMP CHAR, 14H 
0547 7503 JNZ $+5H 
0549 E9TOFC JMP ERROR 
; STATEMENT # 115 
116 3 END; 
@20: 
117 2 END; 
; STATEMENT # 117 
054с 5р РОР ВР 
0540 С20800 RET 8H 
KBGETADDR ENDP 
118 1 KBSUPDATE$IP: 


; STATEMENT # 118 
/% THIS ROUTINE IS CALLED BY SINGLE STEP AND GO TO OUTPUT THE CURRENT 


PL/M-86 COMPILER 


119 


120 


121 


122 


123 


124 


125 
126 


0550 
0551 


0553 
0557 
0559 
0554 
0558 
055С 


055Р 
0562 


0565 
0568 


0568 
0567 
0572 
0574 
0575 


0578 


0578 
0580 
0582 
0584 
0585 
0586 
0588 
0580 
0588 
0590 
0591 
0593 
0595 


0597 
0599 
059А 


0590 
О59Е 


SDK86 KEYPAD MONITOR 


СЗ: ТР AND THE CURRENT INSTRUCTION BYTE. 


OPTIONAL INPUT. #/ 


CALL KBSOUT$WORD(IP,ADDR$FIELD,1, BLANK); 
; STATEMENT # 


PROC NEAR 
BP 
BP,SP 


REGSAV+18H; 1 


AL, 1H 
AX ; 2 
АХ ; 3 
AX Яг 
KBOUTWORD 

; STATEMENT 
AX,REGSAV+18H 
СЗІР,АХ 


; STATEMENT 
АХ, REGSAV+10H 
CSIP+2H,AX 


CALL КВ%900Т9ВҮТЕ( MEMORY$CSIP,0); 


; STATEMENT 
BX,MEMORYCSIPPTR 
ES:MEMORYCSIPE ВХ) 
AL,OH 

AX ; 2 
KBOUTBYTE 


; STATEMENT 
KBGETCHAR 


IF CHAR<>KBCOM AND CHAR<D>KBPER THEN 


; STATEMENT 
CHAR, 11H 
AL,OFFH 


CALL KB$BLANK$ADDRS$FIELD(1); 


; STATEMENT # 


AL,1H 
AX а 4 
KBBLANKADDRFIELD 


CALL KBSBLANK$DATA$FIELD(0); 


KBUPDATEIP 
55 PUSH 
8 BEC MOV 
PROCEDURE; 
FF 364600 PUSH 
8001 MOV 
50 PUSH 
50 PUSH 
50 PUSH 
E8B6FD CALL 
СЗІР,ОРР = IP; 
A1%600 MOV 
A32600 MOV 
CSIP.SEG = CS; 
А13Е00 MOV 
A32800 MOV 
C41E2600 LES 
26FF37 PUSH 
8000 MOV 
50 PUSH 
E85DFD CALL 
CALL KB$GET$CHAR; 
Е820ҒЕ CALL 
803Е5А0011 СМР 
ВОЁР MOV 
7501 JNZ 
40 INC 
50 PUSH 
803Е5А0010 СМР 
ВОРЕ MOV 
7501 JNZ 
40 INC 
$9 POP 
22C1 AND 
0008 АСА 
7316 JNB 
DO; 
B001 MOV 
50 РОЗН 
E821FD CALL 
8000 MOV 
50 PUSH 


; STATEMENT # 


АЫ, ОН 
АХ 504 


Ф 


СЗ: ТР IS OPENED FOR 


/% DISPLAY ТР ®/ 
119 


120 


121 


122 


/% CHANGE СЗ:ТР #/ 


126 


127 


РАСЕ 


16 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


128 


O5A0 E8018FD CALL KBBLANKDATAFIELD 
CALL KB$GET$ADDR(@CSIP,CS,1); 
; STATEMENT # 128 


0543 80062600 LEA AX,CSIP 
05А7 1E PUSH DS . 1 
0548 50 PUSH AX е 
0549 FF363E00 PUSH REGSAV+10H; 3 
O5AD 8001 MOV AL,1H 
OSAF 50 PUSH AX ; 4 
0580 ЕЗШЕЕҒ CALL KBGETADDR 

END; 

822: 

END; 
; STATEMENT # 130 

0583 5D POP BP 
0584 C3 RET 

KBUPDATEIP ENDP 


/ 00а она ооо оо оно нии нони 04880620: 


8 INTERRUPT AND RESTORE/EXECUTE SECTION е 
,96098280888488808408884409820400890400 0 008:608080688888/ 


SAVE$REGISTERS: 
; STATEMENT # 131 
ие THIS ROUTINE IS USED ТО SAVE THE STACKED USER'S REGISTERS IN THE 
MONITOR'S SAVE AREA. 9/ 


SAVEREGISTERS PROC NEAR 
0585 55 PUSH BP 
0586 8BEC MOV BP,SP 
PROCEDURE; | 


ВР = MEMORY$USERSTACK; 
; STATEMENT # 132 


0588 C41E2A00 LES BX,MEMORYUSERSTACKPTR 
05BC 268807 MOV AX,ES: MEMORYUSERSTACK_ ВХ) 
05ВЕ A33800 MOV REGSAV+0AH,AX 


USERSTACK.OFF = USERSTACK.OFF + Ц; 
; STATEMENT # 133 


05с2 83062A0004 ADD USERSTACK,4H 
DO Т=0 TO 10; /% POP REGISTERS OFF OF STACK #/ 
; STATEMENT # 134 
0507 C6065F0000 MOV Т, ОН 
0994: 
05CC ВОЗЕЗЕОООА СМР І,ОАН 
0501 7724 ЈА 895 


RSG$SAV(REG$ORD(I)) = MEMORY$USERSTACK; 
; STATEMENT # 135 


0503 8А1Е5ЕО00 МОУ BL, I 

0507 8700 MOV ВН,ОН 

0509 2Е8А5Е67 MOV BL,CS: REGORD[ BX] 

0500 8700 MOV BH ,OH 

050Р БЛЕЗ SHL BX, 1 

ОБЕ! C4362A00 LES SIT,MEMORYUSERSTACKPTR | 
0525 268B04 MOV АХ, ES:MEMORYUSERSTACK; 51) 
05Е8 89472E MOV REGSAV: ВХ] ‚АХ 


USERSTACK.OFF = USERSTACK.OFF + 2; 
; STATEMENT # 136 


17 


PL/M-86 COMPILER 


ОБЕВ 83062A0002 ADD USERSTACK,2H 
137 3 END; 
; STATEMENT # 137 
05F0 8006520001 ADD 1,1Н 
0525 7505 JNZ @94 
895: 
138 2 SS з USERSTACK.SEG; 
; STATEMENT # 138 
0527 A12C00 MOV АХ, USERSTACK+2H 
ОБРА A34200 MOV REGSAV+14H,AX 
139 2 ЗР з USERSTACK.OPF; 
; ЗТАТЕМЕНТ # 139 
ОБРО А12А00 MOV AX,USERSTACK 
0600 A33600 MOV REGSAV+8H,AX 
140 2 END; 
; STATEMENT # 140 
0603 5D POP BP 
0604 СЗ RET 
SAVEREGISTERS ENDP 
144 1 RESTORESEXECUTE: 
; STATEMENT # 141 
/9 THIS PROCEDURE RESTORES THE STATE OF THE USER MACHINE AND 
PASSES CONTROL BACK TO THE USER PROGRAM. IT CONTAINS A 
MACHINE LANGUAGE SUBROUTINE TO PERFORM THE POPPING OF THE 
USER REGISTERS AND TO EXECUTE AN 'ІВЕТ' TO TRANSFER CONTROL 
TO THE USER'S PROGRAM. ?/ 
RESTOREEXECUTE PROC NEAR 
0605 55 PUSH BP 
0606 8BEC MOV BP,SP 
PROCEDURE; 
142 2 DECLARE НЕЗТОНЕЗЕХЕСОТЕЗСООЕ(?) BYTE DATA 
(08ВН,ОЕСН, /9 MOV BP,SP 9 / 
08BH,046H,002H, /® MOV AX,/BP/.PARM2 е/ 
08ВН,05ЕН,004Н, /% МОМ ВХ,/ВР/,РАВМІ ./ 
O8EH,ODOH, /9 MOV SS,AX 9 / 
О8ВН,ОЕЗН, /9 MOV ЗР,ВХ 9 / 
O5DH, 79 POP BP * / 
OSFH, 79 РОР DL ./ 
05ЕН, 7% РОР 31 ./ 
058Н, /9 POP BX е/ 
ОБАН, 79 POP ОХ е / 
O59H, 79 POP СХ 9/ 
058н, /9 РОР АХ 9 / 
ОТЕН, /9 POP DS 9 / 
007Н, /9 РОР ЕЗ 2 / 
ОСЕН), ие IRET е / 
RESTORESEXECUTE$CODE$PTR WORD DATA ( „АЕЗТОВЕЗЕХЕСЏТЕЗСООЕ); 
143 2 USERSTACK.SEG = 55; 
; STATEMENT # 143 
0608 А14200 MOV АХ, REGSAV+14H 
0608 A32C00 MOV USERSTACK+2H,AX 
144 2 USERSTACK.OFF = SP; 
; STATEMENT # 144 
060Е A13600 MOV АХ, REGSAV+8H 
0611 АЗ2А00 MOV USERSTACK,AX 


SDK86 KEYPAD MONITOR 





PAGE 


18 


PL/M-86 COMPILER 


SDK86 KEYPAD MONITOR PAGE 


145 2 DO 1-0 TO 10; /® PUSH USER'S REGISTERS ONTO HIS STACK %/ 
; STATEMENT # 145 
0614 C6065F0000 MOV Т, ОН 
896: 
0619 ВОЗЕБЕОООА СМР Т, ОАН 
061Е 7726 ЧА 897 
146 3 USERSTACK.OFF = USERSTACK.OFF - 2; 
‚ STATEMENT # 146 
0620 832E2A0002 SUB USERSTACK,2H 
187 3 MEMORY$USERSTACK = REG$SAV( REG$ORD(10-I)); 
: STATEMENT # 147 
0625 B30A МОМ BL,OAH 
0627 ФА 1E5F00 SUB BL, LI 
062B 8700 MOV BH ,OH 
0620 2E8A5F67 MOV BL,CS:REGORD[ BX] 
0631 B700 MOV BH ,OH 
0633 D1E3 SHL BX, 1 
0635 88472Е MOV AX, REGSAV[ BX] 
0638 С41Е23А00 LES ВХ, MEMORYUSERSTACKPTR 
063C 268907 MOV ES:MEMORYUSERSTACK[ ВХ], АХ 
148 3 END; 
; STATEMENT # 118 
063F 80065Е0001 ADD Ж. 
0644 7503 JNZ @96 
897: 
149 2 USERSTACK.OFF = USERSTACK.OFF - 2; 
: STATEMENT # 149 
0646 832E2A0002 SUB USERSTACK, 2H 
199 2 MEMORY$USERSTACK = ВР; 
| ; STATEMENT # 150 
0648  А13800: MOV АХ, REGSAV+0AH 
O64E  СЦТЕСАОО LES BX,MEMORYUSERSTACKPTR 
0652 268907 MOV ES:MEMORYUSERSTACKI BX],AX 
151 2 CALL RESTORES$EXECUTE$CODE$PTR(USERSTACK.OFF,USERSTACK.SEG); 
; STATEMENT # 151 
0655 FF362A00 PUSH USERSTACK; 1 
0659  ЕЕЗ362С0 PUSH USERSTACK+2H; 2 
0650 2EFF160400 CALL CS: RESTOREEXECUTECODEPTR 
152 2 END; 
; STATEMENT # 152 
0662 5D POP BP 
0663 C3 RET 
RESTOREEXECUTE ENDP 
153 1 INTERRUPTI$ENTRY: 
; STATEMENT # 153 
ие THIS PROCEDURE IS CALLED WHEN THE CPU IS INTERRUPTED BY EXECUTING 
AN INSTRUCTION WITH THE TRAP BIT SET (SINGLE STEP). #/ 
0664 06 PUSH ES 
0665 1E PUSH DS 
0666 2E8E1E9A00 MOV 05, СЗ: @@DATA$F RAME 
066B 50 PUSH AX 
066C 51 PUSH CX 
066D 52 PUSH DX 
066Е 53 PUSH BX 
ОббЕ 56 PUSH S I 
0670 57 PUSH DI 


19 


Р,/М-86 COMPILER 


154 


156 


157 


158 


159 


161 


хл) М 


0671 
0674 
0675 
0676 
0677 
0678 
0679 
0674 
0678 
0576 


0670 
0675 


0680 
0682 


0685 
0687 


068А 
0680 


068F 
2692 


069% 


0697 


0690 
06А2 


0548 


06А7 


ОбАА 
ОбАЕ 


0681 
0684 





30К86 KEYPAD MONITOR PAGE 
£80900 CALL INTERRUPTIENTRY 
ЈЕ РОР DI 
5Е РОР 51 
58 РОР BX 
5А РОР DX 
59 POP CX 
58 POP AX 
ЈЕ РОР 05 
07 РОР Е5 
СР IRET 

INTERRUPTIENTRY PROC NEAR 

35 PUSH BP 
ВВЕС MOV ВР,5Р 


PROCEDURE INTERRUPT 1; 
USERSTACK.OFF = STACKPTR; 
89E0 
A32A00 MOV 

USERSTACK.SEG = STACKBASE; 


AX,SP 


/® SAVE USER STACK INFO ?/ 
STATEMENT # 154 


USERSTACK,AX 


STATEMENT # 155 


8со0 MOV AX,SS 
A32C00 MOV USERSTACK+2H, АХ 
ЗТАСКРТЯ = MONITORSSTACKPTR; 
; STATEMENT # 156 
А11400 MOV AX,MONITORSTACKPTR 
89C4 MOV ЗР,АХ 
ЗТАСКВАЗЕ = MONITOR$STACKBASE; 
; ЗТАТЕМЕНТ # 157 
А11600 МОУ АХ, МОМІТОАЗТАСКВАЅЕ 
ЗЕРО MOV SS,AX 
CALL SAVE$REGISTERS; 
; STATEMENT # 158 


Е8ЛЕҒЕ 
Ё з 


CALL 
FL AND (МОТ STEP$TRAP); 


81264800FFFE AND 


SAVEREGISTERS 


/% CLEAR STEP FLAG ?/ 
STATEMENT # 159 


REGSAV+1AH, OFEFFH 


ТЕ LAST$COMMAND<>SS$COMMAND THEN 


803Е610003 СМР 
7403 JZ 823 
CALL RESTORESEXECUTE; 


STATEMENT # 160 


LASTCOMMAND, 3H 


/% CONTINUE ТЕ NOT 55 %/ 
STATEMENT # 161 


ESSEFF CALL RESTOREEXECUTE 
823: 
CALL КВЗОРОАТЕЗТР; 
; STATEMENT # 162 
ЁВ8А6ЕЕ CALL KBUPDATEIP 
IF CHAR=KBCOM THEN 
: STATEMENT # 163 
803E5A0011 CMP CHAR,11H 
7515 JNZ 824 
DO.: 
ІР а СЗІР.ОЄР: 
; STATEMENT # 165 
A12600 MOV AX,CSIP 
A34600 MOV REGSAV+18H,AX 
CS з 031Р.5Е8: 


20 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


167 


168 


169 


170 


172 


173 


; STATEMENT # 166 


0687 412800 MOV АХ, CSIP+2H 
O6BA A33E00 MOV REGSAV+10H, AX 
FL з FL OR STEP$TRAP; /% SET STEP FLAG %/ 
; STATEMENT # 167 
0680 810E48000001 OR REGSAV+1AH, 100H 


CALL RESTORE$EXECUTE; 
; STATEMENT # 168 
06C3 ES 3FFF CALL RESTOREEXECUTE 
END; 
@24; 
ТР CHAR<>KBPER THEN GOTO ERROR; 
; STATEMENT # 170 


06C6 803Е5А0010 CMP CHAR, 10H 
06СВ 7403 JZ $+5H 
06СО ЕОЕСҒА JMP ERROR 


GOTO AFTER$COMMAND; 
; STATEMENT # 172 


0600 E9D6FA JMP AF TERCOMMAND 
END; 
INTERRUPTIENTRY ENDP 
INTERRUPT 3$ENTRY: 


; STATEMENT # 174 
/* THIS PROCEDURE IS CALLED WHEN THE CPU EXECUTES A "ТМТ 3" INSTRUCTION, 
THE MONITOR INSERTS THIS (OCCH) FOR A BREAKPOINT. ALSO AN EXTERNAL 
INTERRUPT OR A USER SOFTWARE INTERRUPT MAY CAUSE THIS PROCEDURE TO BE 


CALLED. ®/ 
06D3 06 _ PUSH ES 
0604 1Е . РОЗН 05 
0605 2Е8Е1Е9АО MOV DS,CS: 9@DATA$FRAME 
O6DA 50 PUSH AX 
0608 51 PUSH сх 
06рС 52 PUSH DX 
0600 53 PUSH BX 
060Е 56 PUSH 51 
060Ғ 57 PUSH DI 
ОбЕО £80900 CALL INTERRUPT3ENTRY 
06Е3 SF POP DI 
ОбЕЦ 5E POP SI 
06Е5 5B POP BX 
06Е6 SA POP DX 
06Е7 59 POP CX 
0668 58 POP AX 
06Е9 ЛЕ POP DS 
06ЕА 07 РОР ЕЗ 
ОбЕВ CF ІВЕТ 
INTERRUPT3ENTRY PROC NEAR 
ОбЕС 55 PUSH BP 
0680 8BEC MOV BP,SP 
PROCEDURE INTERRUPT 3; 
USERSTACK.OFF = STACKPTR; /% SAVE USER STACK INFO #/ 
; STATEMENT # 175 
06ЕР 89Е0 мом АХ, ЗР 
ОБЕ! A32A00 МОУ USERSTACK, AX 


USERSTACK.SEG = STACKBASE; 
; STATEMENT # 176 


21 


Р./М-86 COMPILER 


177 


178 


179 


180 


181 


182 


183 


184 


185 


186 


06РЦ 
06Р6 


0629 
06РС 


ОбЕЕ 
0701 


0703 


0706 


0709 
ОТОА 


070C 
ОТОР 
0713 
0714 
0715 


O71A 
0710 
9720 
0723 


SDK86 KEYPAD 


8CDO 
A32C00 
STACKPTR = 


A11400 
89C4 
STACKBASE = 


A11600 
8EDO 


MONITOR 


MOV AX,SS 
MOV USERSTACK+2H, AX 
MONITORS$STACKPTR; 
; STATEMENT 

MOV AX,MONITORSTACKPTR 
MOV SP,AX 
MONITOR$STACKBASE; 

; STATEMENT 
AX,MONITORSTACKBASE 
55 АТ 


МОУ 
MOV 


CALL SAVE$REGISTERS; 


ЕВАРЕЕ 


; ЗТАТЕМЕНТ 


CALL SAVEREGISTERS 


GOTO AFTERSINTERRUPT; 


ESD6FA 
END; 


INTERRUPTZENTRY 


INITS$INTSVECTOR: 


/9 THIS ROUTINE INITIALIZES AN INTERRRUPT VECTOR AS FOLLOWS: 


FROM THE ADDRESS OF CORRECTED BY THE APPROPRIATE 


; STATEMENT 


JMP AFTERINTERRUPT 


ENDP 


# 


# 


177 


178 


179 


180 


; STATEMENT # 182 


"ТМТЗВООТТМЕ" 


NUMBER OF BYTES FOR THE INTERRUPT PLM PROLOGUE. 
CURRENT CS REGISTER IS DETERMINED BY A MACHINE LANGUAGE CODED 


SUBROUTINE. 


INITINTVECTOR 


79 
ЗВЕС 


8/ 

PROC NEAR 
PUSH BP 

MOV BP,SP 


PROCEDURE( ТМТЗУЕСТОЯЗ РТА, INT$ROUTINESOFFSET) ; 


DECLARE INT$VECTOR$PTR POINTER, 
VECTOR BASED INT$VECTOR$PTR STRUCTURE (OFF WORD, 
CORRECTION LITERALLY 


“лен? я 


ТНТТЗТИНТЗУЕСТОНЗСООЕ( #) BYTE DATA 


(0558, 


/% 


O8BH,OECH, /% 
08СН,0С8Н, /% 
ОСЧН, О5ЕН, ООЧН, /% 
026Н,089Н,007Н, / 9 


0508, 


/% 


0С2Н,004Н,000Н), /% 
INITSINTSVECTOR$CODE$PTR WORD DATA (.INITSINTSVECTORSCODE) ; 


PUS 
MOV 
MOV 
LES 
MOV 
POP 
RET 


H BP 
ВР,5Р 
АХ,С5 





РАСЕ 22 


THE ОҒЕЗЕТ 


THE ЗЕОМЕМТ FROM ТНЕ 


INT$ROUTINESOFFSET WORD, 


SEG WORD), 


/% OFFSET FOR PROLOGUE 9/ 


8 / 
е / 
е / 


ВХ, /ВР/.РАВМ1 4/ 
ES:W/BX/,AX 8 / 


ВР 
4 


CALL INIT$INTSVECTORSCODES$PTR( @VECTOR.SEG) ; 
; STATEMENT # 


C4S5E06 
268D4702 
06 

50 
2ЕҒЕ160600 


VECTOR.OFF = 


884604 
ВЗЕВ 19 
С45Е06 
268907 
END; 


LES 
LEA AX, ES: УЕСТОВ! BX+2H] 
PUSH ES ; 1 
PUSH AX ; 2 
CALL 
INTSROUTINES$OFFSET - 


ЗХ, ВР). ІМТУЕСТОЯРТА 


; STATEMENT # 


MOV 
SUB 
LES 
MOV 


AX,19H 


ES: УЕСТОЯ[ ВХ] ‚АХ 


ВХ,: ВР]. INTVECTORPTR 


184 


CS: INITINTVECTORCODEPTR 
CORRECTION; 


185 


АХ, ВР). INTROUTINEOFFSET 


е / 
8 / 


/% SEGMENT PORTION #/ 


/9 OFFSET PORTION ?/ 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 23 


; STATEMENT # 186 


0726 5D POP BP 
0727 С20600 RET 6H 
INITINTVECTOR ENDP 


/9 ооо ово вана ооо ааа ааа ава наа ава аа ааа ава вана ааа 
ваааавнавоаааааааааа ааа ХХ АДА АЛЛАХА зачета ааа а 


COMMAND MODULE 
2222222222221: 2 


ABSTRACT 


THIS MODULE CONTAINS ALL THE COMMANDS IMPLEMENTED AS INDIVIDUAL PROCEDURES 
AND CALLED FROM THE OUTER BLOCK OF THE COMMAND DISPATCH LOOP, 


MODULE ORGANIZATION 
THIS MODULE CONTAINS THE FOLLOWING SECTIONS: 


1. COMMANDS SECTION 


KB$GO со 
KB$SINGLE$STEP SINGLE STEP 
KB$EXAM$MEM SUBSTITUTE MEMORY 
KB$EXAM$REG EXAMINE REGISTER 
KB$MOVE MOVE 
КВЗТНРОТ ТМРЏТ PORT 
КВУООТРОТ ОЏТРЏТ РОВТ 
2. COMMAND DISPATCH (OUTER BLOCK, MAIN PROGRAM LOOP) 
NEXT$COMMAND DISPATCH 
ERROR ERROR ROUTINE 
./ 
/501080880992800900023808808908800 
. COMMANDS SECTION . 
98808088848898082888480489080808/ 
187 1 KB$GO: 
; STATEMENT # 187 
/9 IMPLEMENTS THE "00" COMMAND, DISPLAYS ІР AND CURRENT INSTRUCTION 
BYTE AND OPENS CS:IP FOR INPUT AND ONE OPTIONAL BREAKPOINT, 
BEGINS EXECUTION WHEN А PERIOD IS DEPRESSED AND DISPLAYS 'Е' IN 
THE ADDRESS FIELD, UPON ENCOUNTERING A BREAKPOINT, 'BR' IS 
DISPLAYED IN THE DATA FIELD, 9/ 
KBGO PROC NEAR 
072, 55 PUSH BP 
0728 8BEC MOV BP,SP 
PROCEDURE; 
188 2 CALL KB$UPDATE$IP; /% OPTIONAL CHANGE CS:IP %/ 
; STATEMENT # 188 
0720 Е820ОҒЕ . CALL KBUPDATEIP 
189 2 IF CHAR=KBCOM THEN 
; STATEMENT # 189 
0730 803E5A0011 CMP CHAR,11H 
0735 7548 JNZ @26 
190 2 DO; /8 BREAKPOINT #/ 


191 3 CALL KB$BLANK$ADDR$FIELD(1); 


PL/M-86 COMPILER 


132 


199 


19 4 


195 


797 


198 


199 


201 


202 


203 


0737 
9739 
073A 


0730 
073F 
0740 


0743 


0745 
ОТЦА 
0748 
07%С 
0759 
0752 
МГ? 32 


0756 
0758 
0750 


9760 
0764 
0767 


076А 


076Е 
0772 
0776 
0778 


0778 


0780 


0782 


0787 
0789 








SDK36 KEYPAD MONITOR 


; STATEMENT # 191 


8001 MOV AL, 1H 
50 PUSH AX 8: З 
ЕВ881ЕВ CALL KBBLANKADDRF IELD 


CALL KBSBLANK$DATA$FIELD(O); 
; STATEMENT # 192 


B000 MOV AL,OH 
50 PUSH AX с 9 
ES64FB CALL KBBLANKDATAFIELD 


CALL KB$GET$CHAR; 
; STATEMENT # 193 
Е855ЕС CALL KBGETCHAR 
CALL KB$GET$ADDR(@BRK1,CSIP.SEG,1); 
; STATEMENT # 194 


80062200 СЕА АХ, ВЕК! 

ТЕ PUSH DS 1 
50 PUSH AX ; 2 
ЁЁ362800 РЈ5Н С5ІР»2Н ; 3 
8001 MOV AL,1H 

50 PUSH AX ; 4 
ЕВАВЕО CALL KBGETADDR 


IF CHAR<>KBPER THEN GOTO ERROR; 
; STATEMENT # 195 


803Е5А0010 СМР CHAR, 10H 
7403 42 $+5H 
E95CFA JMP ERROR 


BRK1$SAVE = MEMORY$S8RK1; 
; STATEMENT 8 197 


(14182200 LES BX, MEMORYBRKIPTR 
268A07 MOV АС , ЕЗ : МЕМОВУВАКТ- ВХ) 
А25900 МОУ BRKISAVE,AL 


MEMORY$BRK1 = BREAKSINST; 
; STATEMENT # 198 
26С507СС MOV ES:MEMORYBRK1_BX],0CCH 


ТЕ MEMORY$BRK1<>BREAK$INST THEN GOTO ERROR; 


; STATEMENT # 199 


С41Е2200 LES BX,MEMORYBRKX1PTR 
26803FCC CMP ES:MEMORYBRK1_BX],0CCH 
7403 JZ $+5H 

Е9Ш1ҒА ЈМР ERROR 


BRKI$FLAG = TRUE; 
; STATEMENT # 201 


C5065800FF MOV BRKIFLAG,OFFH 
END; 
; STATEMENT # 202 
EBOA JMP 829 
826: 
ELSE 


IF CHAR<>KBPER THEN GOTO ERROR; 
; STATEMENT # 203 


803Е5А0010 СМР СНАН, 10H 
7403 JZ $+5Н 
Е930ҒА ЈМР ERROR 
; STATEMENT # 294 
829: 


CALL KBSODISPLAY( @KBSEXEC ADDRS$SFIELD,O); 
; STATEMENT # 205 


PAGE 


24 


PL/M-86 COMPILER 


SDK86 KEYPAD MONITOR PAGE 


078C 2Е80062Ғ00 LEA AX,CS:KBEXEC 
0791 ОЕ PUSH с5 ; 1 
0792 50 РОЗН АХ ; 2 
0793 8001 MOV AL, 1H 
0795 50 PUSH AX ; 3 
0796 8000 MOV AL,OH 
0798 50 PUSH AX Эн! 
0799 ЕЗВБРА CALL KBDISPLAY 
206 CALL KB$BLANK$DATA$FIELD(0); 
; STATEMENT # 206 
079C 8000 MOV AL,OH 
079Е 50 PUSH AX ; 1 
079F E805FB CALL KBBLANKDATAFIELD 
207 IP = CSIP.OFF; 
| ; ЗТАТЕМЕНТ # 207 
0742 412600 MOV AX,CSIP 
0745 A34600 MOV REGSAV+18H, AX 
208 CS = CSIP.SEG; 
; STATEMENT # 208 
07А8 A12800 MOV AX,CSIP+2H 
ОТАВ АЗЗЕОО MOV REGSAV+10H, AX 
209 FL = FL AND (МОТ STEP$TRAP); 
; STATEMENT # 209 
ОТАЕ 81264800FFFE AND REGSAV+1AH, OFEFFH 
210 CALL ВЕЗТОНЕЗЕХЕСИТЕ; 
; STATEMENT # 210 
078% ЕВЦЕРЕ CALL RESTOREEXECUTE 
211 END; 
; STATEMENT # 211 
0787 5D POP BP 
07B8 C3 RET 
KBGO ENDP 
212 KB$SINGLE$STEP: 
; STATEMENT # 212 
/8 IMPLEMENTS THE SINGLE STEP COMMAND. DISPLAYS IP AND THE 
CURRENT INSTRUCTION WORD. OPENS CS:IP FOR INPUT. DEPRESSING 
COMMA CAUSES THE MONITOR TO SINGLE STEP THE INSTRUCTION, 
AND PERIOD TERMINATES THE COMMAND. %/ 
KBSINGLESTEP PROC NEAR 
0789 55 PUSH BP 
ОТВА 8BEC MOV BP,SP 
PROCEDURE; 
213 2 CALL KB$UPDATE$IP; /9 OPTIONAL CHANGE OF CS:IP #/ 
; STATEMENT # 213 
ОТВС E891FD CALL KBUPDATEIP 
214 2 IF CHAR<>KBCOM THEN GOTO ERROR; 
; STATEMENT # 214 
ОТВЕ 803E5A0011 CMP CHAR,11H 
0705 7403 22 $+5Н 
ОТСб E9F3F9 ЈМР ERROR 
IP = CSIP.OFF; 
; STATEMENT # 216 
ОТС9 А12600 MOV AX,CSIP 
ОТСС A34600 MOV REGSAV+18H, АХ 
217 2 CS = CSIP.SEG; 


; STATEMENT # 217 


25 


Р,/М-86 COMPILER 50К86 KEYPAD MONITOR PAGE 


221 


222 
223 


226 


228 


229 


го гә 


ОТСЕ А12800 MOV АХ, CSIP+2H 
9702 А33Е00 МОУ REGSAV+10H,AX 
FL з FL OR ЗТЕРЗТНАР; /% SET TRAP FLAG ВІТ IN PSW ?/ 
; STATEMENT # 218 
0705 810Е48000001 OR REGSAV+1AH,100H 


CALL НЕЗТОНЕЗЕХЕСИТЕ; 
; STATEMENT # 219 


0708 E827FE CALL RESTOREEXECUTE 
END; 
; STATEMENT # 220 
07DE 50 POP BP 
ОТОЕ СЗ RET 
KBSINGLESTEP ENDP 
КВЗЕХАМЗМЕМ: 


| ; STATEMENT # 221 
/® IMPLEMENTS THE EXAMINE MEMORY COMMAND. PROMPTS FOR AN 
ADDRESS AND THEN DISPLAYS THE BYTE OR WORD AT THAT LOCATION, 
IT THEN [5 OPTIONALLY OPENED FOR INPUT. COMMA INCREMENTS TO 
THE NEXT LOCATION. PERIOD TERMINATES. 9/ 


KBEXAMMEM PROC NEAR 
ОТЕО 55 PUSH BP 
07Е1  ВВЕС MOV ВР, ЗР 
PROCEDURE; 
DECLARE W WORD; 
CALL KB$BLANKSADDRS$FIELD(1); /% PROMPT FOR ADDRESS #/ 
; STATEMENT # 223 

07Е3 8001 MOV AL,1H 
O7E5 50 PUSH AX ; 1 
0726 E8DSFA CALL KBBLANKCADDRFIELD 


CALL KBSGETS$CHAR; 
; STATEMENT # 224 


07Е9 ESAFFB CALL KBGETCHAR 
CALL КВЗСЕТЗАРОН ( ФАНСТ,С5,1); /% GET ADDRESS %/ 
; STATEMENT # 225 
07ЕС 30061А00 LEA AX, ARGI 
ОТЕО 1E PUSH DS 1 
07Е1 50 PUSH АХ ; - 
ОТЕ2 ЕЕЗ6ЗЕ00 PUSH REGSAV+10H; 3 
0725 8001 MOV AL,1H 
0728 50 PUSH AX ; 4 
0729 280520 CALL KBGETADDR 


ТЕ CHAR<>KBCOM THEN QOTO ERROR; 
; STATEMENT # 226 


ОТЕС 803Е5А0011 СМР СНАК,118 
0801 7403 Ја $+5H 
0893 298629 ЈМР ERROR 


DO WHILE TRUE; 
: STATEMENT # 228 
998: 
CALL KBSOUT3SWORD(ARG1.OFF,ADDR$FIELD,0O, BLANK); /% CLEAR PROMPT ?/ 
; STATEMENT $ 229 


9806 FF361A00 PUSH ARG1 62.7 
080, 8001 MOV АС, 1Н 
980С 50 PUSH AX зе 
9890 8109 MOV Со, ОВ 


ОВОЕ 51 PUSH СХ ‚3 


26 


PL/M-86 COMPILER 


2 32 


233 


236 


238 
239 


= > 


0810 
0811 


0814 
0817 
0819 


0818 
081Ғ 
0822 
0824 
08 25 
0827 
0828 
0829 
0826 


082Е 
0832 
0835 
0837 
0838 


0838 


ОВЗЕ 
0843 


0845 
0846 


0847 
O84C 
ОВЦЕ 


0851 
0854 
0856 


0858 
085A 
085B 
085D 
085E 


50К86 KEYPAD MONITOR PAGE 


50 PUSH AX ; 4 
E801FB CALL KBOUTWORD 
IF WORD$MODE THEN 
; STATEMENT # 230 


A06000 MOV AL,WORDMODE 
0008 RCR AL, 1 
7313 JNB 833 


CALL KB$OUT$WORD(MEMORY$WORD$ARGI1,DATA$FIELD,1,NOBLANK); 
STATEMENT # 231 


, 

C41E1A00 LES BX,MEMORYARGIPTR 
26FF37 PUSH ES:MEMORYWORDARG1: BX] 
В000 МОМ АБ, ОН 
50 PUSH AX ; 2 
8101 MOV CL,1H 
51 PUSH CX Е 3 
50 PUSH AX ; 4 
ЕЗЕЗЕА CALL KBOUTWORD 
EBOD JMP 034 

033: 

ELSE 


CALL КВЗОЏТЗВУТЕ( MEMORY$ARG1,1); 
; STATEMENT # 232 


C4¥1E1A00 LES BX,MEMORYARGIPTR 
26FF37 PUSH ES:MEMORYARG1: BX] 
8001 MOV AL,1H 
50 PUSH AX 5 2 
E89AFA CALL KBOUTBYTE 

е3ц: 


CALL KB$GET$CHAR; 
; STATEMENT # 233 
E85DFB CALL KBGETCHAR 
IF CHAR=KBPER THEN RETURN; 
; STATEMENT # 234 


803E5A0010 CMP CHAR, 10H 
1502 JNZ 835 
; STATEMENT # 235 
5D POP BP 
C3 RET 
035: 


IF CHAR<>KBCOM THEN 
; STATEMENT # 236 


803E5A0011 CMP CHAR,11H 
7503 JNZ $+5H 
E99100 JMP @36 


IF WORD$MODE THEN 
; STATEMENT # 237 


A06000 MOV AL,WORDMODE 
0008 RCR AL,1 
7343 JNB 037 

DO; 


W = KB$GET$EXPR(DATA$FIELD,1,NOBLANK); 
; STATEMENT # 239 


B000 MOV АС, ОН 
50 PUSH AX 5 1 
В101 МОУ CL,1H 
51 PUSH CX за 
50 PUSH АХ : 3 


27 


PL/M-36 COMPILER 


280 


245 


246 
247 


248 


4: м 


085Р 
0862 


0865 
O86A 
086C 
086Е 
086Р 
0879 
0875 
0877 
0879 
0874 
0878 
0870 
ОВТЕ 
0881 


0884 
0837 
0888 


ОВВЕ 
0892 
0895 
0899 


0898 
0890 
0895 
ОВАО 
ОВАТ 
ОВАЗ 
ОВАЦ 
ОВА? 


ОВАА 
ОВАЕ 
0881 
0883 
0384 
9885 
ОЗВА 
08BC 
0885 
ОВВЕ 
08С0 


SDK86 KEYPAD MONITOR PAGE 
ЕВБЗЕВ CALL KBGETEXPR 
A34E00 MOV Я, АХ 


ТЕ (CHAR<>KBCOM) AND (CHAR<>KBPER) THEN GOTO ERROR; 
; STATEMENT # 240 


803E5A0011 CMP CHAR,11H 
BOFF MOV AL, OF FH 
7591 JNZ $+3H 
10 ІНС АХ 
50 PUSH AX ; 1 
803Е5А0010 СМР CHAR, 10H 
BOFF MOV AL,OFFH 
7501 JNZ $+3Н 
40 ING АХ 
59 РОР CX : 4 
2261 AND 41 CL 
0008 RCR AL, 1 
7303 JNB $+5H 
Е938Ғ9 ЈМР ERROR 
MEMORYS$WORDSARG1 = W; 
; STATEMENT # 242 
А 1ЦЕОО MOV АХ, W 
С81Е1А00 LES BX,MEMORYARGIPTR 
268907 MOV ES:MEMORYWORDARG1; ВХ] ‚АХ 


ТЕ MEMORY$WORD$ARG1<>W THEN GOTO ERROR; 
; STATEMENT # 243 


СЦ1ЕТАОО LES BX,MEMORYARGIPTR 
268807 MOV АХ, ES: MEMORYWORDARG1° BX] 
ЗВОбЦЕОО СМР АХ, И 
Е842 ЈМР 29 
END; 
; STATEMENT # 245 
937: 
ELSE 
DO; 
Ч = KBSGET$SEXPR(DATASBYTE,1,NOBLANK); 
; STATEMENT # 247 
BOFF MOV AL,OFFH 
50 PUSH AX ; 1 
8001 MOV А,,1Н 
50 PUSH AX : 2 
8000 MOV АС, ОН 
50 РОЗН АХ ; 3 
ЕВОБЕВ CALL KBGETEXPR 
A34E00 MOV W,AX 
IF (CHAR<>KBCOM) AND ( СНАЙ< > КВРЕН) THEN GOTO ERROR; 
; STATEMENT # 248 
803Е5А0011 СМР СНАН,11Н 
BOF F MOV АС, ОРЕН 
7501 JNZ $+3Н 
40 INC AX 
50 PUSH АХ "1 
803E5A0019 CMP CHAR, ТОН 
BOFF MOV АС, ОРЕН 
7501 JNZ ".3Ч 
40 INC AX 
59 POP cz а 
2261 AND Au, GU 


28 


PL/M=86 COMPILER SDK86 KEYPAD MONITOR 
08с2 0008 RCR АШ, 1 
08С4 7303 JNB $+5H 
08C6 E9F3F8 JMP ERROR 
250 4 МЕМОНҮЗАЯС1 = LOW(W); 
: STATEMENT # 250 
08С9 А1%Е00 MOV АХ, М 
ОВСС C41E1A00 LES 8X,MEMORYARGIPTR 
0800 268807 MOV 5$: МЕМОЯТАНСТ ВХ], АС 
251 4 ТЕ MEMORYSARG1<>LOW( м) THEN GOTO ERROR; 
; STATEMENT # 251 
0803 А14ЕОО МОУ АХ, м 
0806 CH1E1AOO LES BX,MEMORYARGIPTR 
08рА 263807 CMP ES:MEMORYARGIEBX],AL 
89: 
0820 7403 JZ $+5H 
O8DF E9DAF8 JMP ERROR 
: STATEMENT 252 
253 4 END; 
836: 
254 3 ТЕ CHAR=KBPER ТНЕМ RETURN; 
$ STATEMENT 254 
08Е2 803E5A0010 СМР СНАН,10Н 
ОВЕ? 17502 JNZ 843 
; STATEMENT # 255 
08Е9 50 POP BP 
ОВБА СЗ RET 
943: 
256 3 ТЕ WORD$MODE THEN 
; STATEMENT 256 
08ЕВ  А06000 MOV AL,WORDMODE 
O8EE 0008 RCR AL,1 
ОВЕО 7307 JNB ayy 
257 3 ARG1.OFF з АЯСТ,ОРЕ + 2; 
; STATEMENT 257 
ОВЕ2 83061A0002 ADD ARG1,2H 
08F7 2805 ЈМР 810 
ецц: 
ELSE 
258 3 ARG1.OFF = ARG1.OFF + 1; 
; STATEMENT 258 
0829 83061A0001 ADD АВС1,1Н 
259 3 END; 
; STATEMENT 259 
910: 
O8FE Е905ҒҒ ЈМР 898 
599: 
260 2 END; 
: STATEMENT 260 
0901 5D POP BP 
0902 СЗ RET 
KBEXAMMEM ENDP 
261 1 КВЗЕХАМЗКЕС: 


/9 IMPLEMENTS THE EXAMINE REGISTER COMMAND. 


STATEMENT # 261 
PROMPTS FOR A VALID 


REGISTER KEY AND DISPLAYS THE VALUE OF THAT REGISTER WHICH IS 


OPTIONALLY OPENED FOR INPUT. 


COMMA INCREMENTS TO NEXT REGISTER 


PAGE 


29 


PL/M-86 COMPILER 


0903 
0904 


262 
263 


мо го 


0906 
0908 
0909 


О90С 
265 2. 


090F 

0914 

0916 
267 2 


0919 
09 1С 
268 2 


269 3 


091F 

0921 

0924 
270 3 


0927 
092A 
092C 
092Е 
09 30 
0934 


0938 
093C 


0940 
0944 
0945 
0946 
0948 
0949 
0948 
094C 

273 3 


094 
0953 


50К86 KEYPAD MONITOR 


UNLESS ТТ IS "Ри" WHICH TERMINATESS AS DOES PERIOD. %/ 
KBEXAMREG PROC NEAR 
55 PUSH BP 
8BEC MOV BP,SP 
PROCEDURE; 
DECLARE I BYTE, SAVE WORD; 
CALL KB$BLANKS$ADDR$FIELD(1); 
; STATEMENT # 263 
8001 MOV AL, 1H 
50 PUSH AX ; 1 
ЕЗВ2Е9 CALL KBBLANKADDRFIELD 
CALL KB$GETS$CHAR; 
; STATEMENT # 264 
ЕВВСРА CALL KBGETCHAR 
IF CHAR>ODH THEN GOTO ERROR; /а INVALID REG KEY Ф/ 
; STATEMENT # 265 
803Е5А0000 СМР CHAR,ODH 
7603 JBE $+5H 
E9A3F8 JMP ERROR 
I = CHAR; 
; STATEMENT # 267 
405400 MOV AL,CHAR 
A26400 MOV 14:45 
DO WHILE TRUE; 
; STATEMENT # 268 
8100: 
DISP(0),DISP(1) = 0; /8 DISPLAY REG NAME %/ 
; STATEMENT # 269 
8000 MOV AL, ОН 
А25800 MOV DISP,AL 
A25C00 MOV DISP+1H,AL 
DISP(2) = KB$REG(I®2); 
; STATEMENT # 270 
A06400 MOV AL,I 
B102 MOV CL,2H 
F6E1 MUL CL 
8963 MOV BX, АХ 
2E8A4F4B MOV CL,CS:KBREG{ ВХ) 
880E5D00 MOV DISP+2H,CL 
DISP(3) з КВҘЋЕС(1%2+1); 
; STATEMENT # 271 
ФЕВАЦЕЦС MOV CL,CS:KBREG: ВХ+1Н] 
880Е5Е00 MOV DISP+3H,CL 
CALL KBS$DISPLAY(@DISP,ADDR$FIELD,0O); 
; STATEMENT # 272 
8D065B00 LEA AX,DISP 
ЈЕ РОЗН 03 ; 1 
50 PUSH AX хо 8 
800! MOV AL, 1H 
59 PUSH AX и: 3 
B000 MOV AL,OH 
59 PUSH AX ЭГ 
E802F9 CALL KBDISPLAY 
CALL KBSOUT$WORD( REG$SAV(I),DATASFIELD,1,NOBLANK); /% VALUE %/ 
; STATEMENT # 273 
ЗА 1Е6400 мом 81,1 
8700 MOV BH,OH 


PAGE 30 


РІ,/М-86 COMPILER 


0955 
0957 
095A 
0950C 
095D 
095F 
0960 
0961 


0964 
215 3 


0967 
0966 
096E 
0970 
0971 
0972 
0977 
0979 
0978 
097C 
097D 
097F 
0981 

276 3 

277 4 


0983 
0985 
0986 
0988 
0989 
098A 
098D 
278 4 


0990 
0995 
0997 
0999 
0994 
099B 
09A0 
09А2 
O9A4 
09А5 
09А6 
0948 
O9AA 
O9AC 
280 4 


09АҒ 
0983 
0985 


SDK86 KEYPAD MONITOR PAGE 
D1E3 SHL BX, 1 
ЕЕТ72Е РОЗН REGSAV[BX]; 1 
8000 MOV AL,OH 
50 PUSH AX ; 2 
8101 МОУ CL,1H 
51 PUSH сх ; 3 
50 PUSH AX ЭГ 
E8B1F9 CALL KBOUTWORD 
CALL KB$GET$CHAR; 
; STATEMENT # 274 
ES34FA CALL KBGETCHAR 


IF CHAR<>KBCOM AND CHAR<>KBPER THEN 


; STATEMENT # 275 


803E5A0011 CMP CHAR,11H 
BOFF MOV AL,OFFH 
7501 JNZ $+3H 
40 INC AX 
50 PUSH AX 553 
803E5A0010 CMP CHAR, 10H 
BOFF MOV AL,OFFH 
7501 JNZ $+3H 
40 INC AX 
59 POP СХ з 4 
2201 AND AL, CL 
0008 АСА АС, 1 
ТЗЗА JNB ецт 

ро; 

SAVE = KB$GET$EXPR(DATA$FIELD,1,NOBLANK); /% UPDATE ®/ 

; STATEMENT # 277 

B000 MOV АЫ, ОН 
50 PUSH AX 4 
B101 MOV CL,1H 
51 PUSH CX га 
50 PUSH AX 5-3 
Е828ҒА CALL KBGETEXPR 
A35000 MOV SAVE,AX 


IF CHAR<>KBCOM AND CHAR<>KBPER THEN GOTO ERROR; 


; STATEMENT # 278 


803E5A0011 CMP CHAR, 11H 
BOFF MOV AL, OFFH 
7501 JNZ $+3H 
10 ІМС АХ 
50 PUSH AX 1 
803Е5А0010 СМР CHAR, 10H 
BOFF MOV AL,OFFH 
7501 JNZ $+3H 
40 INC AX 
59 POP CX . 1 
2201 AND АС, CL 
0008 RCR AL,1 
7303 JNB $+5H 
E90DF8 JMP ERROR 

REG$SAV(I) = SAVE; 

: ЗТАТЕМЕКТ # 280 

8A1E6400 MOV BL, I 
В700 МОУ ВН,ОН 
О1ЕЗ SHL ВХ, 1 


31 


PL/M-86 COMPILER 


281 
282 


285 


286 


287 


288 


289 


290 


4 


3 


SDK86 KEYPAD MONITOR 


0987 А15000 MOV 
098А 89472Е MOV 
END; 
847: 
IF CHARsKBPER OR 1:13 THEN 


AX,SAVE 


; 
СНАК,10Н 


0980 803Е5А0010 СМР 
09с2 BOFF мо“ AL,OFFH 
09С 7401 JZ $+3Н 
0966 40 INC AX 
0967 50 PUSH АХ 2 
09С8 803E64000D CMP Т, ООН 
09СО BOFF MOV AL,OFFH 
09СЕ 7401 JZ $+3H 
0901 40 INC AX 
0902 59 POP CX è 
0903 0ҮС1 OR AL, CL 
0905 0008 ВСА AL, 1 
0907 7302 JNB 949 
09029 50 РОР ВР 
O9DA СЗ RET 

849: 

1-5 I +* 1; 

, 
09DB 8006640001 ADD I,1H 
END; 

0920 E93CFF JMP 8100 

8101: 

END; 
, 

0923 5D POP BP 
О9ЕЧ СЗ ВЕТ 

KBEXAMREG ENDP 

KB$MOVE: 


/9 IMPLEMENTS THE MOVE COMMAND. 


A DIFFERENCE WHEN READ BACK, 


KBMOVE PROC NEAR 
09Е5 55 РИЗН ВР 
09Е6 8BEC MOV ВР ,SP 

PROCEDURE; 


CALL KB$BLANK$ADDRSFIELD( 3); 





REGSAV, ВХ], АХ 


RETURN; 
STATEMENT # 282 


STATEMENT # 283 


STATEMENT # 284 


STATEMENT # 285 


STATEMENT # 286 


STATEMENT # 287 


PAGE 


/% DONE? %/ 


PROMPTS FOR 3 ARGUMENTS AND MOVES 
THE BLOCK OF MEMORY SPECIFIED BY ARG1-ARG2 TO ARG}. 
THEN ERROR. 9/ 


IF THERE ІЗ 


/9 FIRST ARGUMENT #/ 


STATEMENT # 288 


09Е8 8003 MOV AL, 3H 
09ЕА 50 PUSH AX ‚1 
09ЕВ Е800Е8 CALL KBBLANKADDRFTIELD 
CALL КВЗСЕТЗСНАЯ; 
; STATEMENT # 289 
09ЕЕ ES8AAFY CALL KBGETCHAR 


CALL KBSGETSADDR(@ARG1,CS, 3), 
09Е1 8D061A00 LEA AX,ARG1 
O9F5 1E PUSH DS ч 


STATEMENT # 290 


1 


32 





PL/M-86 COMPILER 


09F6 
09F7 
О9РВ 
09FD 
09FE 


0А01 

0А06 

0408 
293 2 


ОАОВ 

0А00 

ОАОЕ 
294 2 


0А11 
295 2 


OA14 
0416 
ОА17 
0А19 
ОАТА 
ОА18 
ОАТЕ 
296 2 


0А21 

OA24 

0428 

OA2A 
298 2 


0А20 

0А32 

ОАЗЦ 
300 2 


ОАЗТ 

0439 

ОАЗА 
301 2 


ОАЗО 
зог г 


OA4O 
ОАЦЦ 
0445 
0446 
ОАЧА 
OA4C 
ОАЦО 
303 2 


SDK86 KEYPAD MONITOR 


50 PUSH AX ; 2 
FF363E00 PUSH REGSAV+10H; 3 
8003 MOV AL, ЗН 
50 PUSH AX ; 4 
ЕВООЕВ CALL KBGETADDR 

IF CHAR<>KBCOM THEN GOTO ERROR; 


PAGE 


; STATEMENT # 291 


803Е5А0011 СМР CHAR,11H 
7403 Ј2 $+5H 
E9B1F7 JMP ERROR 


CALL KB$BLANK$ADDR$FIELD(2); 


/* SECOND ARGUMENT #/ 


; STATEMENT # 293 


8002 MOV AL, 2H 
50 PUSH AX ; 1 
E8ADF8 CALL KBBLANKADDRFIELD 
CALL KB$GET$CHAR; 
; STATEMENT # 291 
E887F9 CALL KBGETCHAR 
END$OFF = KB$GET$EXPR(ADDR$FIELD,2, BLANK); 
; STATEMENT # 295 
8001 MOV AL, 1H 
50 PUSH AX ; 1 
B102 MOV CL,2H 
51 PUSH ex ; 2 
50 PUSH AX 
E897F9 CALL KBGETEXPR 
A31800 MOV ENDOFF, AX 
IF END$OFF<ARG1.OFF THEN GOTO ERROR; 
; STATEMENT # 296 
A11800 MOV AX, ENDOFF 
3B061A00 CMP AX, ARG 
7303 JNB $+5H 
E98FF7 JMP ERROR 
ТЕ CHAR<>KBCOM THEN GOTO ERROR; 
; STATEMENT # 298 
803E5A0011 CMP CHAR,11H 
7403 12 $+5Н 
E985F7 JMP ERROR 
CALL KB$BLANK$ADDR$FIELD(1); /* THIRD ARGUMENT #/ 
; STATEMENT # 300 
8001 MOV AL, 1H 
50 PUSH AX ; 1 
E881F8 CALL KBBLANKADDRFIELD 


CALL KB$GET$CHAR; 
; STATEMENT 
E85BF9 CALL KBGETCHAR 
CALL KB$GET$ADDR(@ARG3,ARG1,SEG,1); 


; STATEMENT 

8D061E00 LEA AX,ARG3 
1E PUSH DS 5 1 
50 PUSH AX ‚ 2 
FF361C00 PUSH ARG1+2H ; 3 
8001 MOV AL,1H 
50 PUSH AX ; 4 
ЕЗВІРА CALL KBGETADDR 

IF CHAR<>KBPER THEN СОТО ERROR; 


; STATEMENT 


# 301 


# 302 


# 303 


33 


Р,/М-86 COMPILER SDK86 KEYPAD MONITOR PAGE 


305 


306 


308 


310 


311 


314 


315 
316 


317 


го го 


ОА50 803Е5А0010 СМР CHAR, 109 
0455 7403 42 $+5Н 
0457 Е962Р7 ]МР ERROR 
LOOP: 
; STATEMENT $ 305 
LOOP: 

MEMORY$ARG3 = MEMORYSARG1; 
OASA C41E1A00 LES BX,MEMORYARGIPTR 
0А5Е 268407 MOV AL, ES: MEMORYARG1! ВХ) 
0А61 СУТЕ1ЕОО LES BX,MEMORYARG3PTR 
0465 268807 MOV ES: МЕМОЯУАЯС 3’ ВХ), А, 


ТЕ MEMORY$ARG3<>MEMORY$ARG1 THEN GOTO ERROR; 
; STATEMENT # 306 


0А68  СЦ1ЕТЕОО LES BI,MEMORYARG3PTR 
ОА6С 268407 MOV AL, ES: MEMORYARG З” BX] 
OA6F C41E1A00 LES BX,MEMORYARGIPTR 
0А73 263407 CMP AL,ES: MEMORYARG1[ BX] 
0476 7503 JZ $+5H 

0478 E9H1P7 JMP ERROR 


ЇР ARG1.OFF = ЕМОЗОРР THEN RETURN; 
; STATEMENT # 308 


ОАТВ А11А00 MOV AX,ARG1 
ОДТЕ 3В061800 СМР АХ, ЕНООЕР 
04,82 7502 JNZ @55 
; STATEMENT # 309 
084 5D POP BP 
0485 СЗ RET 
055: 


ARG1.OFF = ARG1.OFF + 1; 
STATEMENT # 310 
0486 830614Ү0001 ADD ARG1,14 
АЯСЗ.ОРР з АВСЗ,ОРЕ + 1; 
; STATEMENT Ф 311 
0А88 83061Е0001 ADD ARG3,148 
GOTO LOOP; 
STATEMENT # 312 
ОА90 EBC8 ЈМР LOOP 
END; 
KBMOVE ENDP 


КВЗТНРИТ: 
; ФТАТЕМЕМТ # 314 
/9 PROMPTS FOR А PORT WORD IN THE ADDRESS FIELD. WHEN A COMMA 
IS ENTERED THE BYTE OR WORD IS DISPLAYED IN THE DATA FIELD. 
THIS MAY BE REPEATED FOR MULTIPLE READING OF THE PORT. PERIOD 
TERMINATES THE COMMAND. %/ 


KBINPUT PROC NEAR 
092 55 PUSH BP 
0493 8BEC MOV BP,SP 
PROCEDURE; 
DECLARE PORT WORD; 
CALL KBSBLANKSADDRSFPIELD(1); /8 PROMPT FOR PORT ?/ 
; STATEMENT # 316 

0495 8001 MOV АС, ТВ 
097 50 РИЗН АХ ..1 
0498 Е823Ғ8 CALL KBBLANKADDRFIELD 


CALL КВЗСЕТЗСНАЙ; 





34 


»./М-36 COMPILER 


SDK86 KEYPAD MONITOR PAGE 


; STATEMENT # 317 


ОА9В ESFDF8 CALL KBGETCHAR 
18 2 PORT = KB$GET$EXPR(ADDR$FIELD,1, BLANK); /9 GET PORT NUMBER 1. 
: STATEMENT 4 318 
ОАЗЕ 8001 MOV AL,1H 
ОААО 50 PUSH AX : 1 
OAA1 50 PUSH AX ; 2 
OAA2 50 PUSH AX : 3 
ОДАЗ  ЕВОЕЕ9 CALL KBGETEXPR 
ОАА6 А35200 MOV PORT, АХ 
319 2 CALL KB$SOUT$WORD( PORT,ADDRSFIELD,9, BLANK); /® REMOVE PROMPT #/ 
; STATEMENT # 319 
ОАА9 FF365200 PUSH PORT ; 4 
ОААРр 8001 MOV AL,1H 
OAAF 50 PUSH AX ; 2 
ОАВО 8100 MOV CL,OH 
OAB2 51 PUSH cx ка 
ОАВЗ 50 PUSH AX ; 5 
OABY ЕВ5ЕР8 CALL KBOUTWORD 
320 2 LOOP: 
; STATEMENT # 320 
LOOP: 
ОАВ? 803E5A0011 CMP CHAR, 11H 
OABC 7403 JZ $+5H 
ОАВЕ  ЕЗЕВЕбБ JMP ERROR 
IF CHAR<>KBCOM THEN GOTO ERROR; 
322 2 IF WORD$MODE THEN 
; STATEMENT # 322 
ОАС1 А06000 MOV AL,WORDMODE 
ОАСЧ 0008 RCR AL,1 
ОАС6 7310 JNB 857 
323 2 CALL KB$OUT$WORD(INWORD(PORT),DATA$FIELD,O,NOBLANK); 
; STATEMENT # 323 
0АС8 8В165200 MOV DX,PORT 
OACC ED INW DX 
OACD 50 PUSH AX : 1 
ОАСЕ 8000 МОУ AL,OH 
OADO 50 PUSH AX ; 2 
ОАр1 50 PUSH AX : 3 
OAD2 50 PUSH AX : 4 
ОА03  ЕВЗЕЕ8 CALL KBOUTWORD 
ОА06 ЕВОС JMP 058 
057: 
ELSE 
324 2 CALL KB$OUT$BYTE( INPUT( PORT) ,0); 
: STATEMENT # 324 
0408 8В165200 МОУ ОХ, РОЯТ 
OADC EC IN DX 
OADD 50 PUSH AX e 
OADE 8000 MOV AL, ОН 
ОАЕО 50 PUSH AX : 2 
ОАЕ1 E8F1F7 CALL KBOUTBYTE 
058: 
325 2 CALL KB$GET$CHAR; 
; STATEMENT # 325 
ОАЕЦ E8SBNNF8 CALL KBGETCHAR 
326 2 IF CHAR=KBPER THEN RETURN; 





PL/M-86 COMPILER 50К86 KEYPAD MONITOR PAGE 


328 
329 


330 


331 


332 


333 


334 


335 


337 


338 


333 


го 


; STATEMENT # 326 


ОДЕ? 803Е5А0010 CMP CHAR, 10H 
ОАЕС 7569 JNZ LOOP 
; STATEMENT # 327 
ОАБЕ 5D POP BP 
ОАЕР СЗ RET 
GOTO LOOP; 
END; 
KBINPUT ENDP 
KBSOUTPUT: 


; STATEMENT # 330 
/* PROMPTS FOR A PORT WORD IN THE ADDRESS FIELD AND A BYTE OR 
WORD DATUM IN THE DATA FIELD. THIS DATUM IS OUTPUT A SINGLE TIME 
TO THE SPECIFIED PORT. 2?/ 


KBOUTPUT PROC NEAR 
ОАРО 55 PUSH BP 
OAF1 8BEC MOV ВР, ЭР 


PROCEDURE; 
DECLARE (DATUM,PORT) WORD; 
CALL KBSBLANKS$ADDRSFIELD(1); /9 PROMPT FOR PORT %/ 
; STATEMENT # 332 | 


ОАЕЗ 8001 MOV AL,1H 
2АҒ5 50 PUSH AX . 1 
ОДЕб E8C5F7 CALL KBBLANKADDRFTELD 


CALL KBSGETS$CHAR; 
; STATEMENT # 333 
0АҒ9 E89FFS CALL KBGETCHAR 
PORT = KBSGETSEXPR(ADDRS$FIELD,1, BLANK); 
; STATEMENT # 334 


OAFC 8001 MOV AL, 1H 

OAFE 50 PUSH AX ; 1 
OAFF 50 PUSH AX ; 2 
овоо 50 PUSH AX ; 3 
ово! E8B1F8 CALL KBGETEXPR 
0804 A35600 MOV PORT,AX 


ТЕ CHAR<>KBCOM THEN GOTO ERROR; 
; STATEMENT # 335 


0807 803Е5А0011 CMP CHAR,11H 
080С 7403 JZ $+5Н 
OBOE E9ABF5 ЈМР ERROR 
CALL KB$OUT$WORD(PORT,ADDR$FIELD,O,BLANK); /% REMOVE PROMPT %/ 
; STATEMENT # 337 
9811 FF365600 PUSH PORT ма 
0815 8001 MOV AL,1H 
0817 50 PUSH AX га 
0818 8100 MOV CL,OH 
ОЗТА 51 PUSH СХ # У 
0818 50 PUSH AX ; 4 
ОВІС БВЕбЕ? . CALL KBOUTWORD 
CALL KBSBLANK$DATA$FIELD(1); /9 PROMPT FOR DATUM ?/ 
; STATEMENT # 338 
ОВТЕ 8001 MOV AL,1H 
0821 50 PUSH AX ;: 1 
3822 E882F7 CALL KBBLANKDATAFTELD 


CALL KBSGETSCHAR; 
; STATEMENT # 339 


36 


PL/M-36 COMPILER 


SDK86 KEYPAD MONITOR 


А 
» (373 2, 


0825 Е873Ғ8 CALL KBGETCHAR 
340 2 LOOP: 
: STATEMENT # 340 
LOOP: 
0828 А06000 MOV AL,WORDMODE 
овгв DOD8 RCR AL, 1 
OB2D 7308 JNB 861 
ТЕ WORD$MODE THEN 
341 2 DATUM = KB$GET$EXPR(DATA$FIELD,1,NOBLANK); / GET DATUM WORT 
STATEMENT # 341 
ОВ2Е 8009 MOV АС, ОН 
0831 59 РОЗН АХ Л 
0832 8101 MOV CL,1H 
0834 51 РУЗН CX Е e 
0835 EBO8 ЈМР 618 
861: 
ELSE 
342 2 DATUM = KB$GET$EXPR(DATASBYTE,1,NOBLANK); /8 GET DATUM ВҮТ- , 
; STATEMENT # 342 
0837 ВОҒЕ MOV AL,OFFH 
0839 50 РОЗН АХ 5 4 
ОВЗА 8001 MOV AL,1H 
ОВЗС 50 PUSH AX га 
0830 8000 MOV AL,OH 
818: 
ОВЗЕ 50 РУЗН АХ г.в 
0840 E872F8 CALL KBGETEXPR 
0843 A35400 MOV DATUM, АХ 
343 2 ТЕ CHAR=KBCOL THEN GOTO ERROR; 
; STATEMENT # 343 
0846 803E5A0014 CMP CHAR,14H 
0848 7503 JNZ $+5Н 
0840 E96CF6 ]МР ERROR 
345 2 ТЕ WORD$MODE ТНЕМ 
: ЗТАТЕМЕНТ # 345 
0850 А06000 MOV AL,WORDMODE 
0853 0008 RCR AL, 1 
0855 730A JNB 064 
346 2 OUTWORD( PORT) = DATUM; 
; STATEMENT 4 345 
0857 88165600 MOV DX,PORT 
ОВ5В A15400 MOV AX, DATUM 
0855 EF OUTW DX 
OBSF 2808 JMP 965 
064: 
ELSE 
347 2 ОЈТРЏТ(РОВТ, = LOW( DATUM); 
| ; STATEMENT # 347 
0861 115500 MOV AX, DATUM 
0864 88165600 MOV DX,PORT 
0868 ЕЕ OUT DX 
@65: 
348 2 ТЕ CHAR=KBCOM THEN /* MULTIPLE OUTPUTS #/ 
; STATEMENT й 348 
0869 803E5A0011 CMP CHAR, 11H 
OB6E 7510 JNZ 266 


349 2 


00: 


37 


РО/М-86 COMPILER 


351 


352 


354 
355 


356 


291 


358 


359 


360 





0870 
0872 
0873 


0876 


0879 
0875 


0880 
0881 


0096 
0090 
0042 
О0А5 
00А7 
00АС 
OOAD 


ООАЕ 
0081 
0083 


0084 
0086 


0087 
ООВС 
00BD 
ООВЕ 
9060 
О0С 1 
00C3 
ООСЦ 


00С7 


SDK86 KEYPAD MONITOR 


CALL КВЗВГАМКЗОАТАЗЕТЕ:О( 1); 


; STATEMENT # 
AL,1H 
AX ; 1 
KBBLANKDATAFIELD 


; STATEMENT # 
KBGETCHAR 


IF CHAR<>KBPER THEN GOTO LOOP; 


8001 MOV 
50 PUSH 
Е831Е7 CALL 
CALL КВЗСЕТЗСНАЯ; 
E822F8 CALL 
803Е5А0010 СМР 
7548 УМ 2 
END; 
866: 
END; 
50 РОР 
C3 RET 
KBOUTPUT 


; STATEMENT # 
CHAR, 108 
LOOP 
; STATEMENT 1 
; STATEMENT і 
BP 
ENDP 


лаававааваавав оао ава ваа аа аа ава ааа ааа аа 


ы COMMAND DISPATCH MAIN PROGRAM LOOP ” 
вагававовав наа ааа наа соо ва ва даваа ааа / 


DISABLE; 
; STATEMENT # 
FA CLI | 
2E8E 169800 MOV 55, СЗ: @@STACK$FRAME 
ВС5000 MOV SP,@@STACK$OFFSET 
8 BEC MOV ВР, SP 
2E8E1E9A00 MOV DS,CS:@@DATAS$FRAME 
FB STI 
РА CLI 
OUTPUT(KB$STATS$PORT) = KBSINITSMODE; 
; STATEMENT 8 
BAEAFF MOV DX,OFFEAH 
8000 MOV АС, ОН 
БЕ OUT DX 
OUTPUT(KB$STAT$PORT) = KBSINITSSCAN; 
; STATEMENT В 
8039 MOV AL, 39H 
EE OUT DX 
CALL KBSDISPLAY( @KBSSIGNON,ADDR$FIELD,9); 
; STATEMENT % 
2E8D061F00 LEA АХ, СЗ: KBSIGNON 
ОЕ PUSH 65 . 1 
50 PUSH АХ 14 
8001 MOV AL,1H 
50 PUSH AX #72 
8000 моу АБ, ОН 
50 РУЗН АХ : 4 
ЕВВАО 1 CALL KBDISPLAY 


CALL КВЗОТЗРЬАУ ( @KB$VERSION, DATASFIELD,0O); 


2Е80062300 LEA 


; STATEMENT # 
AX,CS:KBVERSION 


PAGE 38 


350 


351 


396 


353 


355 


356 


/% INIT 8279 #/ 


397 


358 


/% SIGN ОМ MESSAGE #/ 
359 


/% VERSION NUMBER #/ 
360 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR | PAGE 39 


00СС ОЕ РОЗН 65 ; 1 
0060 50 PUSH АХ ; 2 
ООСЕ 8000 MOV AL,OH 
0000 50 PUSH AX ; 3 
0001 50 РОЗН АХ . y 
0002 E87CO1 CALL KBDISPLAY 
/* INITIALIZE USER'S REGISTERS #/ 
361 1 CS,SS,DS,ES,FL,IP = 0; 
; STATEMENT # 361 
0005 880000 MOV АХ,ОН 
0008 A33E00 MOV REGSAV+10H,AX 
OODB A34200 MOV REGSAV+14H, AX 
OODE A34000 MOV REGSAV+12H, AX 
00Е1 A34400 MOV REGSAV+16H, AX 
OOE4 A 34800 MOV REGSAV+1AH, АХ 
00Е7 A34600 MOV REGSAV+18H, AX 
362 1 SP = USER$INIT$SP; 
; ЗТАТЕМЕЧТ # 362 
OOEA С70636000001 MOV REGSAV+8H, 100H 
363 1 CALL INIT$INT$VECTOR(@INT$VECTOR(1),,INTERRUPTI$ENTRY); 
; ФТАТЕМЕНТ # 363: 
00Ғ0 80060400 LEA АХ, INTVECTOR+4H 
OOF4 ЛЕ PUSH DS ` :1 
00Ғ5 50 PUSH AX ; 2 
OOF6 B87D06 MOV AX, OFFSET( INTERRUPTIENTRY ) 
00Е9 50 PUSH AX 
OOFA Е80С06 CALL INITINTVECTOR 
364 1 CALL INIT$INT$VECTOR( @INT$VECTOR(2),. INTERRUPT 3$ENTRY); 
STATEMENT # 364 
OOFD 80060800 LEA AX, INTVECTOR+8H 
0101 1E PUSH DS ; 1 
0102 50 PUSH AX ; 2 
0103 В8ЕСОб MOV AX, OF FSET( INTERRUPT 3ENTRY ) 
0106 50 PUSH AX ; 3 
0107  Е8ЕЕС5 CALL INITINTVECTOR 
365 1 CALL INITSINT$VECTOR( @INT$VECTOR(3),.INTERRUPT3$ENTRY); 
; STATEMENT # 365 
010A 8D060C00 LEAS AX, INTVECTOR+0CH 
010E 1E PUSH DS ; 1 
ОТОЕ 50 РОЗН АХ : 2 
0110 B8ECO6 MOV AX, OFFSET( INTERRUPT3ENTRY) 
0113 50 PUSH AX ; 3 
0114 ЕВЕ205 CALL INITINTVECTOR 
366 1 BRK1$FLAG = FALSE; 
; STATEMENT # 366 
0117 С606580000 MOV BRK1FLAG, ОН 
367 1 MONITOR$STACKBASE = STACKBASE; /% SAVE MONITOR STACK VALUES %/ 
; STATEMENT # 367 
011C 8Ср0 MOV AX,SS 
ОТТЕ A31600 MOV MONITORSTACKBASE, AX 
368 1 MONITOR$STACKPTR = STACKPTR; 
; STATEMENT # 368 
0121 89Е0 MOV AX,SP 
0123 A31400 MOV MONITORSTACKPTR, AX 


369 1 СОТО AFTERSERROR; 


Р./М-86 COMPILER 


9125 2810 JMP AFTERERROR 
370 1 NEXT$COMMAND: 
: STATEMENT # 370 
/% THIS IS THE PERPETUAL COMMAND LOOP WHICH DISPATCHES TO EACH 
COMMAND WHICH ІЗ A SEPARATE PROCEDURE, 8/ 
NEXTCOMMAND: 
0123 2£80061300 LEA АХ, С5: КВСММОРМТ 
0120 95 PUSH 05 20 
0122 50 PUSH AX : 2 
0122 8001 MOV AL, ТВ 
0131 59 PUSH AX 53 
0132 8000 MOV АБ, ОН 
0134 50 РУЗН АХ : 4 
0135 281901 CALL KBDISPLAY 
CALL KBSDISPLAY( @KBSCMNDS$PMT,ADDRSFIELD,O); 
371 1 AFTERSERROR: 
; STATEMENT # 371 
AFTERERROR: 
CALL KB$GETS$CHAR; 
0138 £86002 CALL KBGETCHAR 
372 1 CALL КВУВЬАНКЗАРрОН3ЕТ2 1, 0( 0); 
; ЗТАТЕМЕНТ # 372 
0138 8000 MOV AL,OH 
0130 50 PUSH AX а: 3 
0132 237001 CALL KBBLANKADDRFTIELD 
373 1 CALL KB$BLANK$DATA$FIELD(O); 
; STATEMENT # 373 
0141 8000 MOV AL,OH 
0143 50 PUSH AX . 4 
0144 £86001 CALL KBBLANKDATAFTELD 
374 1 ЇР (LAST$COMMAND:=CHAR)>O9OH THEN GOTO ERROR; 
; STATEMENT # 374 
0147 A05A00 MOV AL,CHAR 
ОТЧА  А26100 MOV LASTCOMMAND,AL 
0140 3С09 CMP АС, ЭН 
0148. 7768 ЈА ERROR 
376 1 WORDSMODE = FALSE; 
; STATEMENT # 376 
0151  С606600000 MOV НОВОМООЕ , ОН 
377 1 00 САЗЕ СНАН; 
; ЗТАТЕМЕМТ # 377 
0156 8A1E5A09 MOV BL, CHAR 
015А 8700 MOV ВН, ОН 
0156 0753 SLL ВХ, 1 
0155 2Е?ЕА7?9501 JMP С5:9102° ВХ) 
378 2 CALL КВЗЕХАМЗМЕМ; 
379 а CALL ХВЗЕХАМЗНЕО; 
; STATEMENT # 379 
871: 
0163 689007 CALL KBEXAMREG 
0156 2841 ЛИР АРТЕВСОММАМО 
330 2 CALL 68339: 


50636 <EYPAD MONITOR 


; STATEMENT # 369 


; STATEMENT # 380 


PAGE 


40 


PL/M-86 COMPILER 


381 


382 
383 
384 


385 


389 


393 


397 


398 


юм 


0168 
0168 


0160 
0170 


0172 
0175 


0177 


0170 


017Е 


0181 


0186 


0189 


0188 


0190 


0193 


0195 
0197 
0199 
0198 
0190 
ОТ9Е 
01А1 
ОТАЗ 
ОТА5 
01А7 


SDK86 KEYPAD MONITOR 


E8BFO5 CALL KBGO 
EB3C JMP AF TERCOMMAND 
CALL KB$SINGLES$STEP; 
; STATEMENT # 381 
87 3: 
E84906 CALL KBSINGLESTEP 
ЕВЗТ ЈМР AFTERCOMMAND 
CALL KB$INPUT; 
CALL KB$OUTPUT; 
CALL KB$MOVE; 
; STATEMENT # 384 
076: 
587008 CALL KBMOVE 
EB32 JMP AFTERCOMMAND 
DO; WORD$MODF = TRUE; CALL КВ$ЕХАМ$МЕМ; END; 
877: 
: STATEMENT # 386 
C6066000FF МОУ WORDMODE, OF FH 
: STATEMENT й 387 
@19: 
E86106 CALL KBEXAMMEM 
; STATEMENT 4 388 
EB28 | ЈМР AFTERCOMMAND 
DO; WORD$MODE = TRUE; CALL KB$INPUT; END; 
878: 
; STATEMENT # 390 
С6066000ЕҒ MOV WORDMODE, OF FH 
; STATEMENT # 391 
821: 
280909 CALL KBINPUT 
; STATEMENT й 392 
ЕВІЕ ЈМР AFTERCOMMAND 
DO; WORD$MODE = TRUE; CALL KB$OUTPUT; END; 
079: 
; STATEMENT # 394 
С6066000ҒҒ MOV WORDMODE,OFFH 
; STATEMENT # 395 
025: 
E85D09 CALL KBOUTPUT 
; STATEMENT # 395 
ЕВ14 ЈМР AFTERCOMMAND 
END; 
; STATEMENT # 397 
@102: 
7001 ри 019 
6301 ри 871 
6801 DW 872 
6D01 DW 873 
8601 DW 821 
9001 DW 825 
7201 ри 876 
7701 DW 877 
8101 DW 978 
8801 ри 279 
AFTER$SCOMMAND: 


; STATEMENT # 398 


PAGE 


41 


2./М-86 COMPILER 


399 


500 


403 


го 


ОТА9 
ОТАС 
ОТАЕ 
0183 
0185 
0186 


0189 


ОТ ВС 
ОТВЕ 
01С1 
0106 
01СВ 
01CC 
01CD 
01CF 
9100 
0102 
0103 


0105 
0108 
0109 


0106 


01DF 
01Е2 
ОТЕЦ 
0129 
01ЕС 


01ЕЕ 





SDK86 KEYPAD MONITOR PAGE 
AFTERCOMMAND: 
BC5000 MOV SP,8@STACK$OFFSET 
8BEC MOV BP,SP 
2E8E1E9A00 MOV 05,05:88рАТАЕНАМЕ 
8000 MOV АС, ОН 
50 РОЗН АХ ; 1 
E8EE00 CALL KBBLANKDATAFIELD 
CALL KB$BLANK$DATAS$FIELD(0); 
GOTO МЕХТЗСОММАНО ; 
; STATEMENT # 399 
Е96СҒЕ ЈМР МЕХТСОММАКО 
ERROR: 
; STATEMENT # 400 
/е THIS ROUTINE HANDLES ALL ERRORS DETECTED BY THE MONITOR AND WILL 
OUTPUT THE ERROR MESSAGE TO THE DISPLAY AND THEN JUMP TO 
"AFTERSERROR' TO GET ANOTHER COMMAND. %/ 
ERROR: 
BC5000 MOV ЗР , ВО ЗТАСКЗОРЕЗЕТ 
8 ВЕС МОУ ВР,5Р 
2Е8Е1Е9А00 MOV 05 ,С5: @@DATA$FRAME 
2Е8р062800 LEA AX,CS:KBERRMSG 
ОЕ PUSH cs а 
50 PUSH AX = <2 
8001 MOV AL,1H 
50 PUSH AX 5 3 
8000 MOV АС, ОН 
50 PUSH AX ; 4 
Е87800 CALL KBDISPLAY 
CALL KBSDISPLAY( @KB$SERRSMSG ,ADDRS$FIELD,O); 
CALL KB$BLANKS$DATA$FIELD(0); 
; STATEMENT # 401 
8000 MOV АБ, ОН 
50 РОЗН АХ : 1 
ЕЗСВОО CALL KBBLANKDATAFTIELD 
СОТО AFTERSERROR; 
; STATEMENT # 402 
EX9SOFF ЧМР AFTERERROR 
AFTERSINTERRUPT: 
; STATEMENT # 403 
из THIS ROUTINE CHECKS FOR THE LAST COMMAND WHEN THE MONITOR IS 
REENTERED VIA THE INTERRUPT VECTOR, %/ 
AFTERINTERRUPT: 
ВС5000 MOV 5Р,ЗӨ5ТАСКЗОЕЕЗЕ”Т 
38ЕС MOV BP,SP 
2E8E1E9A00 MOV DS,CS: 449DATASFRAME 
405800 MOV AL,BRKISLAG 
0008 АСА AL, 1 
827; 
7 389 JNB AFTERCOMMAND 
IF BRKISFLAG THEN 
00, 


MEMORY3BRK1 = BRKISSAVE; 
; STATEMENT 9 405 


42 


2./М-86 COMPILER 


408 
409 


410 


414 


w ~ 


са Nw 


01Ғ0 
ОТЕЗ 
О1Е7 


ОТЕА 


01ҒЕ 
0202 
0205 
0206 
0209 
0200 
020Е 
0212 
0214 
0216 
0218 
0219 
021А 
0210 
021F 


0221. 


0225 
0226 
0228 
0226 
0220 
022F 
0231 
0233 
0231 
0235 
0237 
0239 


023B 


0240 
0245 
0246 
0247 
0249 
O24A 
O24B 


024E 


50К86 KEYPAD MONITOR PAGE 


А05900 MOV AL, BRKISAVE 
C4182200 LES BX,MEMORYBRKIPTR 
268807 MOV ES:MEMORYBRK1_ BX],AL 


BRKI$FLAG = FALSE; 
; STATEMENT # 406 
C606580000 MOV BRKIFLAG,OH 
IF ((ІР-1) AND OOOFH)=(BRK1.0FF AND OOOFH) AND 
; STATEMENT # 407 


A14600 MOV AX, REGSAV+18H 
836801 SUB AX, АН 
50 PUSH AX ; 1 
250F00 AND АХ,ОЕН 
8В0Е2200 MOV CX, ВЕК 1 
51 PUSH ех : 2 
81E10F00 AND CX,OFH ` 
3ВС1 СМР АХ, СХ 
ВОЕЕ MOV AL, ОЕЕН 
7401 42 $+3H 
40 ІМС АХ 
SA POP DX : 2 
8756FE XCHG DX,.BP]-2H; 1 
B104 MOV CL,4H 
D3EA SHR DX, CL 
03163E00 ADD DX,REGSAV+10H 
5B POP BX 5.3 
ОЗЕВ SHR BX,CL 
031E2400 ADD BX,BRK1+2H 
50 PUSH AX ; 4 
3BD3 CMP DX, BX 
BOFF MOV AL,OFFH 
7401 41 $+3H 
40 INC AX 
59 POP CX “1 
2201 AND ñL СЕ 
0008 RCR AL, 1 
7383 JNB 827 
(SHR(IP-1,4)+CS)2s(SHR(BRK1.,0FF,4)+BRK1.SE3) THEN 
00; 
IP = IP « 1: 


; ЗТАТЕМЕМТ й 409 

832E460001 SUB REGSAV+18H,1H 
CALL KB$DISPLAY(@KB$BRK1,DATA$FIELD,0); 
; STATEMENT # 410 


2Е8р063 300 LEA А.Х, СЗ: КВВЕК 1 
ОЕ PUSH CS # 1 

50 PUSH AX ; 2 

В000 MOV АБ, ОН 

50 PUSH AX ; 3 

50 PUSH AX ; 4 

E80300 CALL KBDISPLAY 


GOTO НЕХТЗСОММАНО ; 
; STATEMENT # 411 
EQ9D7FE JMP NEXTCOMMAND 
END; 
END; 
GOTO AFTER$COMMAND; 


43 


PL/M-86 COMPILER SDK86 KEYPAD MONITOR PAGE 44 


415 1 END MONITOR; /% END OF MODULE #/ 
EOF 





Р /Ме86 COMPILER SDK86 KEYPAD MONITOR PAGS 45 


CROSS@eREFERENCE LISTING 


DEFN ADDR SIZE 


NAME, ATTRIBUTES, AND REFERENCES 


5 ADDRFIELD LITERALLY 
16 32 108 113 119 205 229 272 295 
313 319 334 337 359 379 300 
398 O1A9H AFTERCOMMAND LABEL 
172 411 
371 0138H AFTERERROR LABEL 
369 402 
403 01ФЕН AFTERINTERRUPT LABEL 
180 
106 0000H 4 ARG STRUCTURE BASED(PTR) 
107 108 112 113 
9 ООТАН 4 ARG! STRUCTURE AT 
225 229 257 258 290 296 302 308 310 
9 ООТЕН 1 ARG3 STRUCTURE AT 
302 311 
34 0006Н 1 B BYTE PARAMETER AUTOMATIC 
35 a” 38 
6 BLANK LITERALLY 
46 108 113 119 229 295 318 319 334 
БЕ ki 
62 0004Н 1 BLANKING BYTE PARAMETER AUTOMATIC 
63 76 87 9 6 
41 0004Н 1 BLANKING BYTE PARAMETER AUTOMATIC 
42 46 
13 ЕНҒЕҒӨН 2 BLOCK8089 | WORD AT INITIAL ABSOLUTE 
13 ЕНЕЕЕВН 4 BLOTK8089PTR POINTER АТ INITIAL ABSOLUTE 
11 ЕНҒЕҒОН 1 80011 BYTE ARRAY(1) AT INITIAL ABSOLUTE 
11 FHFFF1H 2 BOOT2 WORD ARRAY(1) AT INITIAL ABSOLUTE 
11 FHFFF3H 2 B00T3 WORD ARRAY(1) AT INITIAL ABSOLUTE 
12 0000Н 4 BOOTY WORD ARRAY(2) DATA 
10 BP LITERALLY 


150 


PL/M=86 COMPILER 


SDK86 KEYPAD MONITOR 


BREAKINST 


BRK1 


ВАКТЕСАС 


BRKISAVE 


CHAR 


19 COPYRIGHT 


6 
9 0022Н 
5 0058Н 
5 930598 
5 005АН 
4 00088 
183 
10 
9 0026Н 
6 
6 
331 0054H 
105 9006H 
5 0058Н 
15 0000Н 
10 


CORRECTION 


CS 


CSIP 


DATABYTE 


DATAFIELD 


DATUM 


DEFAULTBASE 


DISP 


DISPLAY 


DOUBLE 


DS 


LITERALLY 
198 199 
STRUCTURE AT 
194 407 
BYTE 
201 366 403 
BYTE 
197 405 
BYTE 
60 67 74 
100 109 114 
214 226 234 
275 278 282 
343 348 352 
BYTE ARRAY(19) 
LITERALLY 
185 
LITERALLY 


121 124 225 


STRUCTURE АТ 


120 121 128 
217 
LITERALLY 
74 85 94 
LITERALLY 
28 39 231 
410 
WORD 
341 342 346 
WORD PARAMETER 
106 107 
BYTE ARRAY(3) 
36 37 38 


ЕТО. 271 272 


BYTE 
20 


BUILTIN 
84 


LITERALLY 
361 


BASED( PTR) 


406 
73 89 
124 163 
236 240 
291 298 
374 377 

DATA 
290 407 
165 166 
247 342 
239 273 

JAT 
AUTOMATIC 
39 цц 
АНВАХ (1) 


83 
179 
248 
303 


49 


Зу 
189 
254 
320 


207 


343 


50 


РАСЕ 46 
97 99 
195 203 
265 267 
326 335 
208 216 
341 362 
54 269 


Р /М-36 


400 


62 


41 


153 


174 


COMPILER 


0018H 


01ВСН 


0006H 


0008H 


0008H 


0064H 


005FH 


0709H 


0088H 


0006H 


067DH 


ОбЕСН 


ОООЦН 


0000H 


2 


33 


12 


20 


SDK86 KEYPAD MONITOR 


ENDOFF 


ERROR 


ES 


FALSE 


FIELD 


FIELD 


FIELD 


FL 


GOCOMMAND 


1 


INITINTVECTOR 


INITINTVECTORCODE 


INITINTVECTORCODEPTR 


INPUT 


INTERRUPTIENTRY 


INTERRUPT3ENTRY 


INTROUTINEOFFSET 


INTVECTOR 


WORD 
295 296 308 
LABEL 
72 81 101 115 171 196 200 204 
227 241 244 249 252 266 279 292 
299. 304 307 321 336 349 375 
LITERALLY 
361 
LITERALLY 


366 376 406 


BYTE PARAMETER AUTOMATIC.. 
15 16 


BYTE PARAMETER AUTOMATIC 
63 69 74 76 85 87 94 95 


BYTE PARAMETER AUTOMATIC 
42 54 


LITERALLY 
159 167 209 218 361 


LITERALLY 


BYTE 
267 270 271 273 280 282 284 


BYTE 
19 20 21 43 4y 8 49 50 
134 135 145 147 


PROCEDURE STACK=000EH 
363 364 365 


BYTE ARRAY(15) DATA 
183 


WORD DATA 
184 


BUILTIN 
57 60 324 


PROCEDURE INTERRUPT(1) STACK=0034H 
363 


PROCEDURE INTERRUPT(3) STACK=0006H 
364 365 


WORD PARAMETER AUTOMATIC 
183 185 


POINTER АННАҮ(5) 


PAGE 


239 
297 


97 


PL/M-86 


182 


30 


26 


105 


56 


COMPILER 


0006H 


02BEH 


02А7Н 


00374 


00338 


0018Н 


0251Н 


0028Н 


ОТЕОН 


0903H 


002FH 


0501H 


039BH 


23 


23 


86 


79 


26 


SDK86 KEYPAD MONITOR 


INTVECTORPTR 


INWORD 


LP 


KBBLANKADDRFIELD 


KBBLANKDATAFIELD 


KBBLANKS 


KBBRK1 


KBCMNDPMT 


KBCOL 


KBCOM 


KBDATAPORT 


KBDISPLAY 


KBERRMSG 


KBEXAMMEM 


KBEXAMREG 


KBEXEC 


KBGETADDR 


KBGETCHAR 


363 36% 365 


POINTER PARAMETER AUTOMATIC 
183 18% 185 


BUILTIN 
323 


LITERALLI 
119 120 215 361 407 409 


PROCEDURE STACK=z0010H 
126 191 223 263 288 293 300 316 
372 


PROCEDURE STACK=0010H 
127 192 206 338 350 373 398 401 


BYTE ARRAY(4) DATA 
28 32 


BYTE ARRAY(4) DATA 
410 


BYTE ARRAY(4) DATA 
370 


LITERALLY 
97 109 11% 343 


LITERALLY 
97 124 163 189 214 226 236 240 
275 278 291 298 320 335 348 


LITERALLY 
23 60 


PROCEDURE STACK=000AH 
28 32 39 54 69 205 272 359 
370 400 410 


BYTE ARRAY(4) DATA 
400 


PROCEDURE STACK20030H 
378 387 


PROCEDURE STACK=0024H 
379 


BYTE ARRAY(4) DATA 
205 


PROCEDURE ЗТАСК-002СН 
128 194 225 290 302 


PROCEDURE 5ТАСК-0002Н 


PAGE 


360 


48 


PL/M-86 


62 


187 


311 


287 


34 


COMPILER 


03B5H 


O72AH 


0Х92Н 


09Е5Н 


0205Н 


OAFOH 


0315Н 


ООЦВН 


143 


94 


173 


64 


146 


134 


28 


SDK86 KEYPAD MONITOR 


KBGETEXPR 


KBGO 
KBINITMODE 
KBINITSCAN 
KBINPUT 
KBINRDY 
KBMINUS 
KBMOVE 
KBOUTBYTE 
KBOUTPUT 


KBOUTWORD 


KBPER 


KBPLUS 
KBREG 
KBREGKEY 
KBREGPMT 


KBSTGNON 


70 77 88 122 111 
264 274 289 294 301 
191371 

PROCEDURE WORD STACK=0020H 

108 113 239 247 277 

342 

PROCEDURE STACK=0034H 
38. 

LITERALLY 
357 

LITERALLY 
358 

PROCEDURE 58ТАСК-0024Н 
382 391 

LITERALLY 
57 

LITERALLY 
99 

PROCEDURE STACK=0030H 
384 

PROCEDURE STACK=0012H 
75 86 95 122 232 

PROCEDURE STACK=0024H 
383 395 

PROCEDURE STACK=0016H 

76 87 95 119 229 
337 

LITERALLY 
97 128 170 195 203 
275 278 282 303 325 
LITERALLY 
64 91 99 
BYTE ARRAY(28) DATA 
270. дз 
LITERALLY 
67 
BYTE ARRAY(4) DATA 


59 


BYTE ARRAY(4) АТА 


359 


*23 


317. 


295 


324 


234 
352 


PL/M-86 


212 


118 


340 


320 


COMPILER 


07В9Н 


0550Н 


0023H 


0061H 


00384 


ОАБАН 


овган 


ОАВТН 


0000H 


ООТАН 


0000H 


001ЕН 


0000H 


00229 


00009 


0026H 


0000H 


SDK86 KEYPAD MONITOR 


39 KBSINGLESTEP 


KBSTATPORT 


101 KBUPDATEIP 


4 КВУЕВЗІОМ 


1 LASTCOMMAND 


16 LED 


LOOP 


LOOP 


LOOP 


LOW 


1 MEMORYARG1 


ü MEMORYARGIPTR 


1 MEMORYARG3 


ü MEMORYARG3PTR 


1 МЕМОВТВАК! 


Ч MEMORYBRKIPTR 


1 MEMORYCSITP 


ü MEMORYCSIPPTR 


2 MEMORYUSERSTACK 


PROCEDURE 5ТАСК-0034Н 
381 


LITERALLY 
17 18 oT 59 357 358 


PROCEDURE STACK=0030H 
162 188 213 


BYTE ARRAY(4) DATA 
360 


BYTE 
160 37% 


BYTE ARRAY(16) DATA 
37 38 44 


LABEL 
312 


LABEL 
323 


LABEL 
328 


BUILTIN 
72 86 95 250 251 347 


BYTE ВАЗЕО(МЕМОНХАВСЯРТЯ) ` 
232 250 251 305 305 


POINTER 
9 231 232 242 243 #250 251 


BYTE BASED( MEMORYARG3PTR) 


305 306 
POINTER 
9 305 306 


BYTE BASED( МЕМОНҮВНКЇРТН) 
197 198 199 405 


POINTER 
9 197 198 199 405 


BYTE BASED(MEMORYCSIPPTR) 


122 
POINTER 
9 122 


WORD BASED( MEMORYUSERSTACKPTR ) 
132 135 147 150 


305 


РАСЕ 


306 


50 


Р /М-86 COMPILER 


370 


106 


63 


105 


002АН 


0000H 


009CH 


0016H 


0014Н 


0128H 


0000H 


0000H 


0000H 


0000H 


0000H 


0000H 


0000H 


0063H 


0056H 


0052H 


ОООЦН 


437 


SDK86 KEYPAD MONITOR 
MEMORYUSERSTACKPTR 
MEMORYWORDARG1 


MONITOR 


MONITORSTACKBASE 
MONITORSTACKPTR 
NEXTCOMMAND 
NOBLANK 

OFF 

OFF 

OFF 

OFF 

OFF 

OFF 

OFF 

OPER 

OUTPUT 

OUTWORD 

PORT 

PORT 


PROMPTS 


POINTER 
9 132. 135 197 150 


WORD BASED(MEMORYARG1PTR) 
231 242 243 


PROCEDURE STACK=0050H 


WORD 

157 178 367 
WORD 

156 177 368 
LABEL 

399 411 
LITERALLY 


231 239 247 213 277 323 341 342 


WORD MEMBER(USERSTACK) 
133 136 139 144 146 149 151 158 


WORD MEMBER(CSIP) 
120 165 207 216 


WORD MEMBER( BRK1) 
407 


WORD МЕМВЕВ ( АКСЗ) 
311 


WORD МЕМВЕВ(АВСТ) 
229 257 258 296 308 310 


WORD MEMBER( VECTOR) 
185 


WORD MEMBER( ARG) 
108 112 113 


BYTE 
64 91 100 


BUILTIN 
17 18 23 59 347 357 358 


BUILTIN 
346. 


WORD 
334 337 346 347 


WORD 


318 719 323 124 


BYTE PARAMETER AUTOMATIC 


PAGE 


РЫ/М-86 


62 


41 


3% 


30 


26 


105 


14 


10 


10 


141 


142 


142 


262 


63 


131 


COMPILER 


0006H 


0006H 


ОООЧН 


00048 


0008H 


0004Н 


0008H 


0008H 


0067H 


002ЕН 


0605H 


0072H 


00044 


0050Н 


ООЧАН 


05858 


0002H 


0002H 


11 


28 


95 


22 


80 


50К86 KEYPAD МОНІТОЯ 


PROMPTS 


PROMPTS 


PROMPTS 


PROMPTS 


PROMPTS 


PROMPTS 


PTR 


PTR 


REGORD 


АЕСЗАУ 


RESTOREEXECUTE 


RESTOREEXECUTECODE 


RESTOREEXECUTECODEPTR 


SAVE 


SAVE 


SAVEREGISTERS 


SEG 


SEG 


132 135 
155 166 
#25 213 
86 87 


106 108 113 
BYTE PARAMETER AUTOMATIC 
63 69 73 76 86 
BYTE PARAMETER AUTOMATIC 
42 54 
BYTE PARAMETER AUTOMATIC 
35 39 
BYTE PARAMETER AUTOMATIC 
31 32 
BYTE PARAMETER AUTOMATIC 
27 28 
BYTE PARAMETER AUTOMATIC 
15 21 
POINTER PARAMETER AUTOMATIC 
106 107 108 112 113 
POINTER PARAMETER AUTOMATIC 
15 20 
BYTE ARRAY(11) DATA 
135: 147 
WORD ARRAY( 14) 

73 119 120 121 128 
143 144 147 150 159 
208 209 216 217 218 
361 362 407 409 

PROCEDURE STACK=0008H 

161 168 210 219 

BYTE АННАҮ(22) DATA 
142 
WORD DATA 
151 
WORD 
277 280 
WORD 
FS та 76 82 84 
PROCEDURE STACK=0002H 
158 179 
WORD МЕМВЕВ(05ЕНЗТАСК) 
138 143 191 155 176 
WORD MEMBER( CSIP) 


96 


138 
167 
280 


92 


PAGE 


139 
207 


290 


93 


52 


РЬ /М-86 


106 


10 


10 


11 


183 


COMPILER 


0002H 


0002H 


0002H 


0002H 


0002H 


0062H 


002АН 


ООООН 


1 


SDK86 KEYPAD MONITOR 


SEG 


SEG 


SEG 


SEG 


SEG 


SHL 


SHR 


SP 


55 


SSCOMMAND 


STACKBASE 


STACKPTR 


STARTADDR 


STEPTRAP 


TRUE 


USERINITSP 


USERSTACK 


VECTOR 


121 166 194 


WORD MEMBER( BRK1 
107 


208 


) 


WORD MEMBER(ARG3) 


WORD МЕМВЕВ (АВС 1 
302 


) 


WORD MEMBER( VECTOR) 


184 


WORD MEMBER( ARG) 
107 112 


BUILTIN 
84 


BUILTIN 
37 цц 407 


LITERALLY 
144 


LITERALLY 
143 361 


LITERALLY 
160 


BUILTIN 
155 157 176 


BUILTIN 
154 156 175 


LITERALLY 
11 12 


LITERALLY 
159 167 209 


BYTE 
20 22 23 


LITERALLY 
66 201 228 


LITERALLY 
362 


STRUCTURE AT 
133 136 138 
154 155 175 


178 


177 


218 


268 


PAGE 53 


367 


368 


336 390 394 


STRUCTURE BASED(INTVECTORPTR) 


PL/M=86 COMPILER 


222 OO4EH 
63 OO4CH 
41 000АН 

5 0060H 


MODULE INFORMATION: 


CODE AREA SIZE 


1 


WORDMODE 


VARIABLE AREA SIZE 


з 
СОНЗТАНТ AREA SIZE з 
з 
з 


МАХІМОМ STACK SIZE 


865 LINES READ 


0 PROGRAM ERROR(S) 


END OF Р,/М-86 COMPILATION 


0B82H 
ООООН 
0065H 
0050H 


SDK86 KEYPAD MONITOR 


184 


WORD 
239 


WORD 
65 


WORD 
2 


BYTE 
230 
394 


185 


242 


92 


243 


93 


247 


95 


250 


96 


PARAMETER AUTOMATIC 


цц 


237 


256 


322 


340 


291 


98 


376 


386 


390 


54 


" ЧЕ) SDK-86 SERIAL МОМІТОВ 
<. | А PL/M-86 SOURCE LISTING 





P М-86 COMPILER SDK86 SERIAL MONITOR PAGE 1 


ISIS-II PL/M-86 V1.1 COMPILATION OF MODULE MONITOR 
OBJECT MODULE PLACED IN :F1:SERTAL.OBJ 
° COMPILER INVOKED BY: PLM86 :F1:SERIAL.PLM LARGE OPTIMIZE(2) PAGEWIDTH(95) 


қ $TITLE(*SDK86 SERIAL MONITOR’) 
SNOINTVECTOR 


АНЫЗ 555525541554 40045: йї)90:0:2:0:0 0(0:0: 0 00:0::й::ї ДААД, 
ДИАЛ ЛЛ 55 ЛЛ 5555 555555555555 Қ 0 0 инока 


50К-86 MONITOR, V1.2 
06 AUGUST 1979 


(С) 1978 INTEL CORPORATION. ALL RIGHTS RESERVED. Nu PART 
OF THIS PROGRAM OR PUBLICATION MAY BE REPRODUCED, TRANSMITTED, 
TRANSCRIBED, STORED ІМ A RETRIEVAL SYSTEM, OR TRANSLATED INTO Y 
LANGUAGE, IN ANY FORM OR BY ANY MEANS, ELECTRONIC, MECHAN.CAL, 
MAGNETIC, OPTICAL, CHEMICAL, MANUAL OR OTHERWISE, WITHOUT THE PRIOR 
WRITTEN PERMISSION OF INTEL CORPORATION, 3065 BOWERS AVENUE, SANTA 
CLARA, CALIFORNIA, 95051. 


ЗАЛАЛ ЛЛ ЛД RRR RRR RRR RRR 5 Да ЛАДА ДАЛ ДА АЙЯ: 
ооо ии ааа ааа вољан нивои ни 


ABSTRACT 


~ THIS PROGRAM IS THE ROM BASED SERIAL MONITOR FOR THE 50К-86. IT 
PROVIDES THE USER WITH A MODERATE LEVEL OF CAPABLILITY TO 
EXAMINE/MODIFY MEMORY AND REGISTERS, CONTROL PROGRAM EXECUTION, 
AND LOAD/SAVE PROGRAMS. 


ENVIRONMENT 


THE SDK SERIAL MONITOR COMMUNICATES WITH THE USER VIA AN INTERACTIVE 
TERMINAL (TTY,CRT) ATTACHED TO THE SERIAL PORT. 


PROGRAM ORGANIZATION 


THE PROGRAM Т5 DIVIDED INTO 1 DATA AND 2 CODE MODULES: 


1. DATA DECLARATION MODULE. GLOBAL DATA DECLARATIONS. 
| 2. СОММОМ ROUTINES. LOWER LEVEL PROCEDURES 
ы 3. COMMAND MODULE. INDIVIDUAL COMMANDS AND OUTER BLOCK 


CALLING "АРН 


, >>COMMAND DISPATCH MODULE (OUTER BLOCK) 
INDIVIDUAL COMMAND PROCEDURES 
COMMON ROUTINES 


GLOBAL DATA STRUCTURES 


THE MONITOR MAINTAINS THE USER'S MACHINE STATE (REGISTERS) IN A 
WORD ARRAY. THE REGISTERS ARE SAVED FROM THE USER'S STACK 

AS PUSHED BY PLM86 INTERRUPT PROCEDURE. 

POINTERS TO THE 50К-86 29920 ADDRESS SPACE ARE IMPLEMENTED WITH 


РО/М-86 COMPILER 


е / 


/% 





50К86 SERIAL МОМІТОЯ 


POINTER STRUCTURES ALLOCATED AS 2 WORD STRUCTURES. 


MONITOR: DO; /% BEGINNING OF MODULE %/ 


110200000 00 0 00 0 8 ваа ооо ооо ооо ооо ааа аа ва ва тегов ее т ааа ае RES 
211020020000 50 0 120 0 0 00 аааавааааазавававаа авааанааваававаа аа ава ваа 


GLOBAL DATA DECLARATIONS MODULE 


PAGE = 


THIS MODULE CONTAINS ALL THE GLOBAL DATA DECLARATIONS AND 


LITERALS (EQUATES). 


MODULE ORGAINIZATION 


THE MODULE Т5 DIVIDED INTO 5 SECTIONS: 


1. UTILITY SECTION 
2. 1/0 SECTION 
3. MEMORY ARGUMENTS SECTIONS 
4. REGISTER SECTION 
5. BOOT AND 8089 SECTION 
./ 


/ + 102 0 та ве в еее тете ваа 


е UTILITY SECTION е 
наа навававоавава ва ааа / 


DECLARE 
INT$VECTOR(5) 
DECLARE 
MONITORSSTACKPTR WORD, 
MONTTORS$STACKBASE WORD; 
DECLARE 
COPYRIGHT(*®) BYTE DATA (" (С) 1 
DECLARE 


POINTER; 


GLOBAL FLAGS, VARIBLES, EQUATES 

1/0 PORTS,MASKS,AND SPECIAL CHARS 
STRUCTURES FOR POINTERS 

USER REGISTER SAVE AREA 

BOOTSTRAP AND 8089 DESCRIPTOR 


/9 INTERRUPT VECTORS */ 


978 INTEL CORP'); 


BRKI$FLAG BYTE, /% TRUE ІР BREAK SET #/ 

BRKI$SAVE BYTE, и” INST BREAK SAVE #/ 

CHAR BYTE, /* ONE CHAR LOOK AHEAD */ 

CHECK$SUM BYTE, /% PAPER TAPE CHECKSUM %/ 

1 BYTE, /% INDEX %/ 

END$OFF WORD, /% END OFFSET ADDRESS %/ 

WORD$MODE BYTE, /% WORD MODE FLAG */ 

LAST$COMMAND BYTE; /9 LAST COMMAND SAVE %/ 
DECLARE 

TRUE LITERALLY 'ОБЕН", 

FALSE LITERALLY "ОООН", 

BREAK$INST LITERALLY "ОССН?, /% BREAKPOINT INST %/ 

STEP$TRAP LITERALLY "0100Н", /% SS TRAP FLAG MASK */ 

USER$INITS$SP LITERALLY '100Н', 79 USER STACK INITIAL ?/ 

СОЗСОММАМО LITERALLY "2", /% GO COMMAND CODE #/ 


SS$COMMAND LITERALLY "3", 
STANDARD$LEN LITERALLY "16" 
МАХЗОЕЦАХ 

DECLARE 


/9 SINGLE STEP CODE ?/ 
У /% PAPER ТАРЕ DATA REC LEN %/ 


LITERALLY "10000"; /% DELAY FOR PAPER ТАРЕ %/ 


Е 


‘JLAG 8Я144415241НОНЗН 135У8 415241ХМОНЗИ 
“\Н14$41$2%$АНОИЯИӘ) LV 

( аВОМ 035 "Жаном 330) 38П120815 4152 

/и ОНОМ 41 З SO џ/ “431К174 Н1498415241ХНОНЗиИ 


‘SLAG на | мне 81ХМОНЗИН G3SV8 |(3884ХНОНЗИ 
“сила  : иназлноизие) LY 

(аном 035 ‘аном 330) 380100815 1988 

/ж | 18104ХҮЗНЯ ь/ “34318104 314$ | ЯНЕ ЗАНОИЯЙ 


“31184 Н14$%ОНУ$АНОИЯИ 03548 ЕОНУ ФЛ. WIN 
“(514 608Ү 1НОНЗНӨ ) LY 

(даном 93$ ‘аном 440) зипіопні5 ЕОНУ 

/а £ ІКЗИПОНУ а/ ‘USLNIOd ніафюонувфхномзи 


‘аном ніафіонувфхноняи G3SV8 | ОНУФОНОМФЛНОИЗИ 

‘FLAG ULdSLOUV$SAYOWSW ЗСУВ LOUVSXYOWSW 
“(ULdSLOUVSXYONSWA) LV 

(аном 245 ‘аном 440) 3НП120815 1587 

Ия | ІКЗИПОНУ ь/ “48415104 Н148| ОНУФАНОИЗИ 


ЖҮЗІ ЗІ 1557. 
# К011236 ЈАЗАПОНУ ХНОИЗИ 


зоо као носа ооо 
/и 32985 НО ЯКУ"Я «/ Ног, Х717783117 1859 
/* 1333 3117 #/ ‘HYO,  Х777483117 315% 
/а НИПІЗН ЗОУІННУО «/. ‘НОО, 2Х77783117 4251 
/ + ЧЈУЧ NVOS SWOL в/ > Н6Е, Х711783117 МУ2$$11М1$6Я 
/ь 1003201 АЗУ г “34002КНЗ 
дама 1337 '118-8 8 «/ “4НОО, Х77783117 ЗФОНФІЇКІЗЯХМ 
/а 1808 VLVG «/ " ,Н8343430, Х717у983117 1804%уУ1У4%683 
/« 1804 GNYWWOO/SNLYLS ь/ “4НҮЗ440, Х77у783117 1НОа 81 У1 с вх 
И» Хадия 4934319 LIWX в/ НЕО ь 27743117 KQUXL$OIS 
/з АСУЗН 4154 ЗАТЗЭЗН ь/ г„вго, Х7171783117 10НХМН95015 
ги AOWSY 135 У1Уа #/ HOG., 411V% 841 104504015 
/а КС 414 108 GNWD SV ANYS г/ “,н4г0, 117Ү8Н31117 МО$Н10$1626$01$ 
/а 330 “11 а/ г, Него, Х717783117 1М820%16268%015 
/а За0й 5:29 e/ “.Н420, Х177843117 3009%1!528%015 
/и GNYWWOOD 13534 ь/ 6590, А11УЕЗ111 1485348 5268015 
/а 1804 10481 WiVd e/ ",н03330, ATIVYSLIA 1804%У1У0%01< 
4 


/а 1804 104М1 5ПЈУ15 ь/ 4Н23330. ХЛЛУНЗЈ17 LYUOd$LYLS$OIS 


/а LYYSN 1528 «/ 


/пезававоввввововевовововово 
. NOILOGS SNOILVYVIOSG 0/1 


пваавнанивзвазазавањћава 81:86. 
“(.,МЧО14НМЭХ5,) wWivd 3148 (6)4КН29015 
“(,43424468:98 :8210,) УРУП 3118 (а) 1ТОСУ 
“(05,215 цл SYOLINOW 9@-HGS.‘°HVO'HGO) Уу140 3118 (a )NONDIS$OIS 
“(0*, 48.) УРУП 3148 (4)954 ЯҮЗнН8 4015 
Ив и 8 9 1 е и / 
“(HOO HOO НА: НО: HOO НОО Н90“НЯ 5) VIVA 3118 (6)МОМ91544Ж 
Зоуа YOLINOW ТҮ1835 967 


анупоза | || 


s... 
3877230 | 01 
ЗНҮТЭЗС 1 6 


ЗНУЛОЗО | 8 
.... 


4 
s... 


as калтайоо 98-и/1а 


PL/M=86 COMPTLER SDK86 SERIAL MONITOR PAGE 


MEMORY$USERSTACK$PTR POINTER, 
USERSTACK STRUCTURE (OFF WORD, SEG WORD) 
АТ (@MEMORY$SUSERSTACK$PTR), 
MEMORY$USERSTACK BASED MEMORY$SUSERSTACK$PTR WORD; 


/ + 2022010020000 00 гагаттеотт 


9 REGISTER SECTION е 
99998249488088682082408989080/ 


12 1 DECLARE 

REG(#) ВҮТЕ DATA 79 REGISTER NAMES 9?/ 
('AXBXCXDXSPBPSIDICSDSSSESIPFL'), 

КЕСЗТНОЕХ WORD, 

REG$SAV(14) WORD, /® USER'S SAVED REGS ®/ 

REGSORD( ?) BYTE DATA 
(7,6,1,3,2,0,9,11,12,8,137, 

SP LITERALLY 'REG$SAV( 4)", 

BP LITERALLY " ВЕСЗЗАУ( 5)", 

CS LITERALLY 'REG$SAV( 8)", 

DS LITERALLY 'REG$SAV( 9)", 

ss LITERALLY 'REG$SAV(10)', 

ES LITERALLY 'REG$SAV(11)', 

LP LITERALLY 'REG$SAV(12)', 

FL LITERALLY 'ЯЄСЗЗАУ( 13)"; 


/ т 2200202 0700 08 ваа аа за аа ве аа ааа аа аа а а аа 


е BOOTSTRAP JUMP AND 8089 VECTOR ж 
211133515112 PARSER RAE е / 


/* THIS BOOT CONSISTS ОҒ А LONG JUMP TO THE BEGINNING OF THE MONITOR 
АТ ЕЕОО„ХХХХ WHERE ХХХХ TS THE STARTING ADDRESS OFFSET (IP) AND 
MUST BE DETERMINED AFTER EACH COMPILE. #/ 
13 1 DECLARE 

START$ADDR LITERALLY "ООАВН?, /% STARTING ADDRESS %/ 
BOOT1( #) BYTE АТ (OFFFFOH) DATA (ОБАН), / LONG JUMP OPCODE */ 
BOOT2( š) WORD AT (OSFFFIH) DATA (STARTSADOR), 
BOOT3( B) WORD АТ (OFFFF3H) DATA (ОРРООН); /% SEGMENT ADDRESS! #/ 


/а THIS TWO-WORD DATA IS A JUMP TO THE STARTING ADDRESS AND IS LOCATED 
AT THE FIRST LOCATION OF ROM (NO OTHER DATA OR CONSTANT DECLARATIONS 
MAY PRECEDE IT). THE JUMP IS ACTUALLY TO (ЅТААТ-АОЮОА \-4 SINCE THE 
INSTRUCTION 15 A RELATIVE JUMP OF LENGTH 3. %/ 
14 1 DECLARE 
BOOT4( #) WORD DATA (28990Н,5ТАЯТҘАООВ-4); /% МОР,ЈМР START=ADOR %/ 


/® THIS BLOCK OF ROM АТ FFFF6-FFFFA IS INITIALIZED FOR THE 3089 
DEVICE AND POINTS TO A BLOCK OF КАМ АТ 9100H. ?/ 
15 1 DECLARE 
BLOCK $8089 WORD АТ (OFFFF5H) DATA (093018', 
BLOCK$8089$PTR POINTER АТ (ОРРЕЕЗН) DATA (0019048); 


у ззасзазазазазоазавосавзваваозезае 1 


9 FILL DECLARATIONS SECTION е 
ооо зоо ЗУ 


4 


PL/M-86 COMPILER SDK86 SERIAL MONITOR PAGE 


/% THESE DECLARATIONS ОБРТМЕ FILL CHARACTERS FOR ALL UNUSED 
LOCATIONS IN THE ROM ADDRESS SPACE. ANY MODIFICATION TO THE CODE 
| THAT CHANGES THE USED LOCATIONS IN THE ROM REQUIRES 
- MODIFICATION OF THIS SECTION. #/ 


16 1 DECLARE 


У F LITERALLY 'OFFH', 
FILL1(*) BYTE АТ (OFFFDBH) DATA ( 
FILL2(*) BYTE АТ (OFFFEOH) DATA ( 
FILL3(#) BYTE AT (OFFFF5H) DATA ( 
( 


Р Р.ФОВІ, 
Е,Е,Е,Е,Е,Е,Е,Е,Е,Е,Е,Е,Е,Е,Е), 
, 

FILL4(#) BYTE АТ (OFFFFCH) РАТА Е 


/а чаво нон нос нони ана ааа ана ааа ааа на аа на аа аа ана 
08:08 85:55 55:88:80: 5 555255255  Ц 5 0 й 0 0 5: Л: 20 0: 00: 0 0 4 њи ни аа ка 


COMMON PROCEDURES 


ABSTRACT 


THIS MODULE CONTAINS THOSE LOWER LEVEL PROCEDURES CALLED BY HIGHER 
LEVEL ROUTINES. 


MODULE ORGANIZATION 


THIS MODULE IS DIVIDED INTO 4 SECTIONS AS FOLLOWS: 
1. BASIC 1/0 SECTION 


ñ SIO$CHAR$RDY INPUT CHARACTER READY 
W SIO$CHECK$CONTROL$CHAR CHECK FOR CONTROL CHARACTER 
SIO$OUT$CHAR OUTPUT CHARACTER 
SIO$GET$CHAR INPUT A CHARACTER 
510500Т5ВҮТЕ OUTPUT A BYTE IN HEX 
STOSOUT$WORD OUTPUT A WORD IN HEX 
STO$OUT$BLANK OUTPUT A SINGLE BLANK 
SIO$OUT$STRING OUTPUT A STRING 
STO$OUT$HEADER OUTPUT A PAPER TAPE HEADER 
2. UTILITY ROUTINES SECTION 
SIO$VALID$HEX TEST FOR VALID HEX CHAR 
SIO$HEX CONVERT TO HEX FROM ASCII 
SIO$VALID$REG$FIRST TEST FOR VALID REGISTER FIRST CHAR 
SIO$VALID$REG TEST FOR VALID REGISTER NAME 
SIO$CRLF OUTPUTS A CR AND LF 
SIO$TEST$WORD$MODE TEST FOR А "ИМ" IN COMMAND 
: 51055 САМЗВСАНК SCANS FOR OPTIONAL BLANK 
3. ГЗСОМЕМТ EXPRESSION EVALUATION SECTION 
SIO$GET$WORD GET AN WORD EXPRESSION 
SIO$GET$ADDR GET AN ADDRESS EXPRESSION 
, SIO$UPDATE$IP OPTIONAL UPDATE OF С5:1Р 
Ж» 4% 4. PAPER ТАРЕ READ SECTION 
SIO$READ$CHAR READ CHAR FROM TTY READER 
SIO$READ$BYTE READ A BYTE 
SIO$READ$WORD READ A WORD 
5. INTERRUPT AND RESTORE/EXECUTE ROUTINES 
SAVE$REGISTERS SAVES USER REGISTERS 
RESTORESEXECUTE RESTORE MACHINE STATE AND EXEC 
INTERRUPTI$ENTRY INTERRUPT ROUTINE FOR SINGLE STEP 


РЬ/М-36 COMPILER 50К86 SERIAL MONITOR PAGE 


го 


гә гә 


с FZ.) ла) wn ГО 


ОУ гә гә (Q I Мо» = 


м мг го 


INTERRUPTISENTRY INTERRUPT ROUTINE FOR GO 
INIT$INT$VECTOR INITIALIZES INTERRRUPT VECTORS 
8 / 


ААА ААА. 


е ВАЅІС 1/0 ЗЕСТІОМ ы 
ИТЕУ, 


STO$CHAR$RDY: 

/9 TESTS FOR INPUT CHARACTER PENDING BY READING THE STATUS PORT 
AND MASKING WITH SIO$RXRDY( READ DATA READY). RETURNS TRUE ТЕ 
NOT EMPTY(CHAR PENDING) AND FALSE IF NO CHAR PENDING #/ 

PROCEDURE BYTE; 
IF (INPUT(SIO$STAT$PORT) AND SIO$RXRDY)=20 THEN RETURN FALSE; 
RETURN TRUE; 

END; 


STO$CHECK$CONTROLSCHAR: 
/% THIS ROUTINE CHECKS ТЕ A CONTROL CHARACTER HAS BEEN INPUT TO 
THE SERIAL PORT. AFTER A CONTROLS IT WAITS FOR А CONTROL=-Q BEFORE 
RETURNING 72 THE CALLER. A CONTROL=C CAUSES A JUMP TO THE ERROR 
ROUTINE. 9/ 


PROCEDURE; 
CHAR = ЇНРОТ(5105рАТАРОНТ) AND O7FH; 
IF CHAR=13H THEN /% CONTROLES 2 4/ 
DO WHILE CHAR<>11H; 79 CONTROL=Q ë / 
ТЕ SIO$CHAR$RDY THEN 
00; 
CHAR = INPUT(STO$DATA$PORT) AND O7FH; 
ТЕ СНАН-03Н THEN SOTO ERROR; 
END, 
END; 


ELSE те CHAR = 03H THEN GOTO ERROR; 
END SLO$CHECK$CONTROLS$CHAR; 


ЗТОЗОЦТЗСНАЯ: 

/* THIS ROUTINE OUTPUTS THE INPUT PARAMETER TO THE USART OUTPUT 
PORT WHEN USART 15 READY FOR OUTPUT (XMIT BUFFER EMPTY). #/ 

PROCEDURE(C); 
DECLARE C BYTE; 
ТЕ SIO$CHARS$SRDY THEN CALL SIO$CHECKS$CONTROLSCHAR; 
DO WHILE (ІМРОТ(ЗІОЗЗТАТФРОВТ) AND SIO$TXRDY)=20;END; 
OUTPUT(SIO$DATA$PORT) = С; 

END; 


SIO$GET$CHAR: 

/а THIS ROUTINE INPUTS A CHARACTER FROM THE INPUT PORT AND RETIRNS 
WITH ІТ IN THE GLOBAL ‘CHAR’. THE CHARACTER IS ECHOED TO THE 
OUTPUT PORT IF PRINTABLE. %/ 

PROCEDURE; 
DO WHILE (INPUT(SIO$STAT$PORT) AND STOSRXROY)=20;END; 
CHAR = INPUT(SIOS$DATAS$PORT) AND ОТЕН; 
IF CHAR>=ASBL THEN CALL 31932015СЧАВ(СНАВН!, 

END; 


STISOUTSBYTE: 
/а THIS ROUTINE OUTPUTS THE SINGLE INPUT PARAMETER TO THE JSART 





PL/M-86 COMPILER SDK86 SERIAL MONITOR PAGE 


IN ASCII HEXADECIMAL FORMAT, #/ 
PROCEDURE(8); 


52 2 DECLARE В BYTE; 
23 2 CALL 5ТОФОЈТФСНАК(АЗСТТ(5НЕ(В,4) AND OFH)); 
54 2 CALL SIO$OUT$CHAR(ASCII(B AND OFH)); 
55 2 CHECK3SUM = CHECK$SUM - В; 
56 2 END; 
57 1 STO$SOUT$WORD: 
/® THIS ROUTINE OUTPUTS THE INPUT PARAMETER АЗ 4 ASCII HEXADECIMAL 
CHARACTERS TO THE USART OUTPUT PORT, %/ 
PROCEDURE(W); 
58 2 DECLARE W WORD; 
59 2 CALL STISIUTSBYTE(HISH(W)); 
60 2 CALL STISOUTSBYTE(LOW(W)); 
91 2 ЕМО; 
52 1 ЗІОЗОУТЗВСАМХ: 
/® THIS ROUTINE OUTPUTS ONE BLANK, %/ 
PROCEDURE; 
63 2 CALL ЗТОЗОПТфСНАН( АЗВЬ); 
БЦ 2 ЕНО; 
65 1 SIO$OUT$STRINC: 
/® OUTPUTS A STRING POINTED TO BY THE FIRST PARM. #/ 
PROCEDURE( PTR); 
66 2 DECLARE PTR POINTER, STR BASED PTR (1) BYTE; 
67 2 ї = 0; 
68 2 DO WHILE STR(I)<>9; 
69 3 CALL STISICTSOCRARL ТАТТУ: 
70 2 L зо ж а 
71 3 SND.: 
72 2 ENG; 
#5 1 SIOSOUTSHEADER: 
/%4 THIS ROUTINE OUTPUTS THE PAPER TAPE HEADER CONSISTING ЈЕ ":" 
FOLLOWED BY THE RECORD LENGTH, LOAD ADDRESS, AND THE RECORD TYPE. 
IT INITIALIZES THE CHECKSUM TO ZERO. 9?/ 
PROCEDURE(LENGTH,LOAD$ADDR,REC$TYPE); 
74 2 DECLARE ((ЕМОТН, ВЕСЗТУРЕ) ВҮТЕ, LOAD$ADDR WORD; 
7% 2 CALL SIS$OUT$CHAR( 7:73: 
76 2 СНЕСКЗ5ЏМ 2 2; 
77 2 CALL STO$OUT$BYTE(LENGTH); 
78 2 CALL SIOSOUT$WORD(LOADS$ADOR); 
79 2 CALL STOSOUTSBYTE(RECSTYPE); 
80 2 END; 
81 1 51253251355ТТ:1ЇМО050Е1АҮ: 
/® THIS DELAY ROUTINE ALLOWS THE ЈЅАЯТ SUFFICIENT 7142 
TO SETTLE AFTER WRITE OPERATIONS. @/ 
PROCEDURE: 
22 2 Т = SHR(OFFH,OFFH); 
#3 2 2:33 


узи наа каа каа ДАЛАДА АА, 


ж ость ROUTINES S20 SON в 


PL/M-86 COMPILER SDK86 SERIAL MONITOR PAGE 


84 


10% 


105 


MM ww А 


гә ғә № гә 


— 


м г ка) мә № 


-» fN Г лә КА ка) Го ГО 


го 


д023848843:33:0890:0898489354820:94248238/ 


SIO$VALID$HEX: 

и” THIS ROUTINE TESTS ТЕ THE INPUT PARM IS A VALID ASCII HEX DIGIT 
AND RETURNS TRUE AS THE VALUE OF THE PROCEDURE IF SO AND FALSE 
ТЕ МОТ. #/ 

PROCEDURE (H) BYTE; 
DECLARE H BYTE; 
DO I=O ТО САЗТ(АЗСІІ): 

ТЕ Н.:АЗСЇЇ(1) THEN RETURN TRUE; 

END; 
RETURN FALSE; 

END; 


SIO$HEX: 
/% THIS ROUTINE CONVERTS THE INPUT PARM FROM АЗСТТ TO ITS BINARY 
EQUIVALENT AND RETURNS IT AS THE VALUE OF THE PROCEDURE. NO CHECK 
IS MADE FOR INPUT VALIDITY. */ 
PROCEDURE(C) WORD; 
DECLARE C BYTE; 
ТЕ С<='9' THEN RETURN DOUBLE(C-30H); 
ELSE RETURN DOUBLE(C-37H); 
END; 


STO$SVALID$REG$FIRST: 
/% THIS ROUTINE CHECKS ТЕ ‘CHAR’ IS A VALID FIRST LETTER ОҒ A REGISTER 
NAME AND RETURNS TRUE AS THE VALUE OF THE PROCEDURE ТЕ 50, #/ 
PROCEDURE BYTE; 
DO ї=0 TO 26 BY 2: 
IF CHARSREG(I) THEN RETURN TRUE; 
END; 
RETURN FALSE; 
END; 


SIO$VALID$REG: 

/а THIS ROUTINE CHECKS IF THE TWO INPUT PARMS TAKEN TOGETHER FORM 
A VALID REGISTER NAME. IT SEARCHES THE REGISTER TABLE AND IF А 
MATCH IS FOUND, THE GLOBAL "ВЕОЗТМОЕХ" IS SET TO THE INDEX OF THE 
VALID REGISTER AND THE PROCEDURE RETURNS TRUE. IF NO MATCH THE 
PROCEDURE RETURNS FALSE AND REG$SINDEX IS UNDEFINED. #/ 

PROCEDURE (C1,C2) BYTE; 

DECLARE (C1,C2) BYTE; 
DO REG$INDEX=0 ТО 13; 
IF C1isREG(REG$INDEX#2) AND С2=ВЕС ( ВЕСЗТМОЕХ® 2+1) THEN 
RETURN TRUE; 
END; 
RETURN FALSE; 
END; 


ЗТОЗСЯЦЕ: 
/а THIS ROUTINE OUTPUTS A CR AND LF ТО THE OUTPUT PORT. "/ 
PROCEDURE; 
CALL 510500Т5СНАН(А5СН), 
CALL SIO$OUT$CHAR(ASLF); 
END; 


STO$TEST$WORDSMODE: 


8 


PL/M-86 COMPILER $036 SERIAL MONITOR 


№“ (GQ fo www MN ГО ГЮ 


— 


гә ә ГӘ ГӘ 


“Л МЛ МЛ хл Е ск £ 2 м.м ГОГ г Го 


РР оо £ = 


1- 


/® THIS PROCEDURE TESTS FOR А "И" FOLLOWING THE COMMAND AND ТЕ 50 
SETS THE FLAG 'WORDSMODE TO TRUE OR FALSE OTHERWISE. SCANS OFS 
OPTIONAL BLANK FOLLOWING COMMAND. %/ 

PROCEDURE; 

WORD$MODE = FALSE; 

CALL 51050ЁТ5СНАВ, 

IF СНАН- "И" THEN 
DO; 
WORD$MODE = TRUE; 
CALL ЗТОЗСЕТ$СНАН; 
END; 

ТЕ CHAR=ASBL THEN 
CALL SIO$GET$CHAR; 

END; 


SIO$SCAN$BLANK: 

/* THIS ROUTINE IS CALLED AFTER A COMMAND LETTER TO SCAN OFF THE 
OPTIONAL BLANK. 9/ 

PROCEDURE; 
CALL STO$GET$CHAR; 
IF CHAR=ASBL THEN 

CALL SITO$GET$CHAR; 
END; 


/ озоном на нананааааваа ааа ава ааа 


е ARGUMENT EXPRESSION EVALUATOR SECTION 5 
ТҮЗІЗГІЗІЕЗ 232152235355 аа нан / 


STO$GET$WORD: 
/е THIS ROUTINE READS CHARS FROM THE INPUT PORT AND EVALUATES 
AN EXPRESSION CONSISTING OF '+*-' AND OPERANDS OF HEX NUMBERS 
AND REGISTER NAMES. "/ 
PROCEDURE WORD; 
DECLARE (SAVE,W) WORD, (OPER,T) BYTE; 
OPER = "+"; 


W з 0; 
DO WHILE TRUE; 
T = CHAR; 
SAVE = 0; 
IF SIO$VALID$REG$FIRST THEN 
00; 


CALL 5ТОЗОЕТФСНАК; 
ТЕ SIO$VALID$REG(T,CHAR) THEN 
DO; 
SAVE = REG$SAV(REG$INDEX); 
CALL SIO$GET$CHAR; 
GOTO EVAL; 
END; 
ELSE 
SAVE = SIO$HEX(T); 
END; 
ТЕ NOT(SIO$VALIDSHEX(T)) THEN СОТО ERROR; 
DO WHILE SIO$VALID$HEX( CHAR); 
SAVE = SHL(SAVE,4) + SLO$HEX( CHAR); 
CALL SIO$GETS$CHAR; 
END; 


PL/M=-86 COMPILER SDK86 SERIAL MONITOR PAGE 
157 3 EVAL: IF OPER='+' THEN 
158 3 W = Я + SAVE; 
ELSE 
159 3 W = Я - SAVE; 
160 3 IF CHAR=ASCR OR СНАЯ=':' OR СНАВз',"' THEN 
161 3 RETURN W; 
162 3 IF CHAR='+' OR CHAR=z='-' THEN 
163 3 OPER = CHAR; 
ELSE 
164 3 СОТО ERROR; 
165 3 CALL ЗІОЗСЕТЗСНАВ; 
166 3 END; 
167 2 END; 
168 1 SIO$GET$ADDR: 
/9 THIS ROUTINE ACCEPTS A VALID ADDRESS EXPRESSION CONSISTING 
OF AN OPTIONAL <SEG>: AND AN DISPLACEMENT. #/ 
PROCEDURE( PTR, DEFAULTS$BASE) ; 
169 2 DECLARE PTR POINTER, DEFAULTS$BASE WORD, 
ARG BASED PTR STRUCTURE (OFF WORD, SEG WORD); 
170 2 ARG.SEG = DEFAULTS$BASE; 
171 2 ARG.OFF = SIO$GET$WORD; 
172 2 IF CHAR=':' THEN 
173 2 00; 
174 3 CALL 5ТОФОЕТЗСНАК; 
175 3 ARG.SEG з ARG.OFF; 
176 3 ARG.OFF = SIO$GET$WORD; 
177 3 IF CHAR=':' THEN GOTO ERROR; 
179 3 END; 
180 2 END; 
181 1 ЗТОЗПРРАТЕЗТР: 
/® THIS PROCEDURE IS CALLED BY SINGLE STEP AND GO ТО OUTPUT THE CURRENT 
ІР AND INSTRUCTION BYTE AND OPEN THE ТР FOR INPUT. #/ 
PROCEDURE; 
182 2 CALL SIO$OUTS$BLANK; 
183 2 CALL SIO$OUTSWORD(IP); 
184 2 CSIP.SEG з C3; 
185 2 CSIP.OFF з IP; 
186 2 CALL 510300Т5СНАВ("-"), 
187 2 CALL SIO$OUT$BLANK; 
188 2 CALL SIO$OUT$BYTE(MEMORY$CSIP); 
189 2 CALL SIO$OUTS$BLANK; 
190 2 CALL 5ТОЗОЕТЗСНАК; 
191 2 IF CHAR<>',' AND CHAR<>ASCR THEN CALL ЗТОЗСЕТЗАОПОВ ( бСЗТР ,CS); 
193 2 END; 
упавааавананванавааа ваа ваа аа за не 
, РАРЕЯ ТАРЕ READ SECTION bd 
+210 022202 0020022 012012100102 ваваа ва ва / 
19 4 1 SIO$SREAD$CHAR: 


/% THIS PROCEDURE READS A BYTE FROM THE PAPER ТАРЕ READER OF THE TTY 
BY ACTIVATING ОТН, SAMPLING DSR FOR THE START BIT, DEACTIVATING 
DTR WHEN THE START BIT APPEARS, AND READING THE DATUM FROM THE 
USART. TO PROVIDE A HOLD-OFF CAPABILITY FOR THE LOAD COMMAND 


10 


РО/Ме86 COMPILER SDK86 SERIAL MONITOR PAGE 


195 
196 


197 
198 
199 
200 


226 


227 
228 
229 
230 
231 
232 


ГО ГУ ñ ГУ № fN хл) Е Е с ҮА) 2.2 го Г го 


— 


MM № го го № 


MM Г го 


МА) ЧА) ка) Г № № 


ONLY (МОТ INTENDED FOR ТТҮ РАРЕВ ТАРЕ) CONTROL-S WILL CAUSE THIS 
ROUTINE ТО WAIT FOR A CORRESPONDING CONTROL=Q ТО BE READ BEFORE 
CONTINUING. ®/ 

PROCEDURE BYTE; 
DECLARE DELAY WORD; 


LOOP: 
OUTPUT(SIO$STAT$PORT) = 5125825 140ТНХОН; /% DTR ON "/ 
DELAY з Q; 
DO WHILE (INPUT(SIO$STAT$PORT) AND SIO$DSRDY)20; /*WAIT STARTBIT#/ 
DELAY = DELAY + 1; 
IF DELAY>=MAX$DELAY THEN 
ро; 
OUTPUT(SIO$STAT$PORT) = STO$8251$CMND; /% OTR OFF ?/ 
GOTO ERROR; 
END; 
END; 
OUTPUT(SIO$STAT$PORT) = SIO$8251$CMND; /® DTR OFF ®/ 
DO WHILE (INPUT(SIO$STAT$PORT) AND SIO$RXRDY)=0;END; /* WAIT LOOP %/ 
CALL STO$CHECK$CONTROLS$CHAR; 
ТЕ CHAR = 11H THEN GOTO LOOP; /% GET ANOTHER IF CTL-Q %/ 
RETURN CHAR; 
END; 
SIO$READ$BYTE: 


/8 THIS ROUTINE READS A BYTE FROM THE PAPER TAPE READER. %/ 
PROCEDURE BYTE; 

DECLARE T BYTE; 

T = LOW( STOSHEX(STO$READ$CHAR)); 


T = ЗНІ(Т,Ц) + LOW(SIO$HEX(STO$READ$CHAR)); 
СНЕСУРЗИМ = CHECK$SUM + Т; 
RETURN T; 
END; 
STO$READ$WORD: 


ие THIS ROUTINE READS A WORD FROM THE PAPER TAPE READER AND RETURNS ІТ 
AS THE VALUE OF THE PROCEDURE. %/ 
PROCEDURE WORD; 
DECLARE T BYTE; 
T = SIO$READ$BYTE; 
RETURN SHL(DOUBLE(T),8) + DOUBLE(SIO$READS$BYTE); 
END; 


/ чево они оно ава аа оно ааа на вала аа 


ы INTERRUPT AND RESTORE/EXECUTE SECTION Ы 
22311555555 555555555553 555555532 | 


SAVE$REGISTERS: 
/* THIS ROUTINE IS USED TO SAVE THE STACKED USER'S REGISTERS IN THE 
МОМТТОВ"5 SAVE AREA. %/ 
PROCEDURE; | 
ВР = MEMORY$USERSTACK; 
05ЕҢ5ТАСК.ОЕҒ = USERSTACK.OFF + Ц; 
DO 1:50. TO 19: 79 POP REGISTERS OFF ОҒ STACK #/ 
REG$SAV(REG$ORD(I)) = MEMORYS$USERSTACK; 
USERSTACK.OFF = USERSTACK.OFF + 2; 
END; 


11 


PL/M-86 COMPILER 


233 
234 
235 


236 


237 


NN № 


Мо Момо 2 хл) MN ГӘ 


го Мо го мм м MN № № № 


SDK86 SERIAL MONITOR 
SS = USERSTACK.SEG; 
SP = USERSTACK.OFF; 

END; 

RESTORESEXECUTE: 

/9 THIS PROCEDURE RESTORES THE STATE OF THE USER MACHINE AND 
PASSES CONTROL BACK TO THE USER PROGRAM. IT CONTAINS A 
MACHINE LANGUAGE SUBROUTINE TO PERFORM THE POPPING OF THE 
USER REGISTERS AND TO EXECUTE AN "ТНЕТ" TO TRANSFER CONTROL 
TO THE USER'S PROGRAM. ®/ 

PROCEDURE; 

DECLARE RESTORESEXECUTESCODE(*) BYTE DATA 
(08ВН,0ЕСН, /% MOV BP,SP 9/ 
088Н,246Н,002Н, /% MOV АХ, /ВР/.РАВМ2 8 / 
088Н,05ЕН,0ОЧН, /® MOV ВХ,/ВР/.РАВМІ %/ 
О8ЕН,Орон, /9 MOV SS,AX 9 / 
08ВН,0ЕЗН, /% МОУ 5Р,ВХ ./ 
OSDH, /* POP BP ./ 
05ЕН, /% РОР 01 9 / 
ОБЕН, ге POP 51 B / 
058Н, 79 РОР ВХ 9 
ОБАН, 79 POP рх 9 / 
O59H, 79 POP СХ ”/ 
0588, 79 POP АХ ./ 
ОТЕН, 79 РОР 05 ® / 
007Н, /9 РОР Е5 8 / 
OCFH), /% ТАЕТ ./ 
КЕЗТОНЕЗЕХЕСИТЕЗСООЕЗРТН WORD DATA ( .RESTORESEXECUTES$CODE); 
USERSTACK.SEG = SS; 
USERSTACK.OFF = SP; 
DO [20 TO 10; /% PUSH USER'S REGISTERS ONTO HIS STACK #/ 


USERSTACK.OFF = USERSTACK.OFF - 2; 
MEMORYSUSERSTACK = REGS$SAV(REGS$ORD(10-I)); 
END; 
USERSTACK.OFF = USERSTACK.OPF - 2; 
MEMORYSUSERSTACK = BP; 
CALL RESTORES$SEXECUTESCODES$SPTR(USERSTACK.OFF,USERSTACK.SEG); 
END; 


INTERRUPTISENTRY: 
/% THIS PROCEDURE IS CALLED WHEN THE СРО IS INTERRUPTED BY EXECUTING 


AN INSTRUCTION WITH THE TRAP BIT SET (SINGLE STEP). %/ 
PROCEDURE INTERRUPT 1; 
USERSTACK.OFF = STACKPTR; 
USERSTACK.SEG = STACKBASE; 
STACKPTR = MONITORS$STACKPTR; 
ЗТАСКВАЗЕ = MONITORSSTACKBASE; 
CALL SAVESREGISTERS; 
FL = FL AND (МОТ STEPSTRAP); /% CLEAR STEP FLAG %/ 
IF LASTSCOMMAND<>SS$COMMAND THEN /% CONTINUE IF МОТ SS %/ 
CALL RESTORESEXECUTE; 
CALL STOSCRLF; 
CALL STOSUPDATESTP; 
ТЕ СНАВз"',' THEN 
09: 


/% CHANGE ТО МОМТТОВ"5 STACK #/ 


PAGE 


PL/M=36 COMPILER SDK35 SERIAL MONITOR PAGE 


261 3 ЇР = CSIP.OFF; 

262 3 CS = CSTP.SEG; 

263 3 FL = FL OR STEPS$TRAP; /* SET STEP FLAG ?/ 

264 3 CALL RESTORE$SEXECUTE; 

265 3 END; 

266 2 IF CHAR<>ASCR THEN СОТО ERROR; 

268 2 GOTO NEXT$COMMAND; 

269 2 END; 

270 1 INTERRUPT3$SENTRY: 

/9 THIS PROCEDURE TS CALLED WHEN THE CPU EXECUTES A ‘INT 3" INSTRUCTION. 
THE MONITOR INSERTS THIS (OCCH) FOR A BREAKPOINT. ALSO AN EXTERNAL 
INTERRUPT OR A USER SOFTWARE INTERRUPT MAY CAUSE THIS PROCEDURE TO BE 
CALLED. ?/ 
PROCEDURE INTERRUPT 3; 

271 2 USERSTACK.OFF = STACKPTR; 

272 2 USERSTACK.SEG = STACKBASE; 

273 2 ЗТАСКРТЯ = MONITORSSTACKPTR; 

274 2 STACKBASE = MONITOR$STACKBASE; 

279 2 CALL SAVE$REGISTERS; 

276 2 CALL 5103СВЬР, 

277 2 СОТО AFTERSINTERRUPT; 

278 2 END; 

279 1 INIT$INTSVECTOR: 


/® THIS ROUTINE INITIALIZES AN INTERRRUPT VECTOR AS FOLLOWS: THE OFFSET 
FROM THE ADDRESS OF "ТМТЗВОЏТТМЕ" CORRECTED BY THE APPROPRIATE 
NUMBER OF BYTES FOR THE INTERRUPT PLM PROLOGUE. THE SEGMENT FROM THE 
CURRENT CS REGISTER IS DETERMINED BY A MACHINE LANGUAGE CODED 
SUBROUTINE. ®/ 
PROCEDURE( INT$VECTORS$PTR, INT$ROUTINESOFFSET) ; 
280 2 DECLARE INT$VECTOR$PTR POINTER, INT$ROUTINE$SOFFSET WORD, 
VECTOR BASED INT$VECTOR$PTR STRUCTURE (OFF WORD, SEG WORD), 
CORRECTION LITERALLY "19Н", /% OFFSET FOR PROLOGUE #/ 
INIT$INT$VECTOR$CODE(*) BYTE DATA 


(9558, /* PUSH BP 8 / 
O8BH,OECH, /® MOV BP,SP е / 
ОВСН , ОСВН, /% MOV АХ,С5 е / 
ОСЧН,ОФЕН,ООЧН, /9 LES ВХ,/ВР/.РАНМ1 %/ 
026H,089H,007H, /® MOV ES:W/BX/,AX е / 
0508, 79 POP ВР ./ 
0C2H,004H,000H), /% RET 4 8 / 
INIT$INT$VECTOR$CODE$PTR WORD DATA (.INIT$INT$VECTOR$CODE); 
281 2 CALL INIT$INT$VECTOR$CODE$PTR(@VECTOR.SEG); /% SEGMENT PORTION %/ 
282 2 VECTOR.OFF = INT$ROUTINE$OFFSET - CORRECTION; /9 OFFSET PORTION #/ 
283 г END; 


/% 000 й 00: :0:ї її ї л 0 0 0: 0 0Ц 2 0: 2 0 вв ЛАД ДА ДА Л Є ААА, 
ооо 00:00 2 40 2 024621: 5 002 000606: вз 88484. 3484885864 RRR ERR RRR Р Л Ч 


COMMAND MODULE 


ABSTRACT 





PL/M-86 COMPILER 


ҚА) ЧА) КАЈ КАЈ КАЈ АЈ ww ГӘ ҒӘ ҒӘ 


~ 


гә гә гу № № 


SDK86 SERIAL MONITOR 


AND CALLED FROM THE OUTER BLOCK OF THE COMMAND DISPATCH LOOP. 


MODULE ORGANIZATION 
21:212:22:231::1:1:11:1:: 


THIS MODULE CONTAINS THE FOLLOWING SECTIONS: 


1. 


2» 


./ 


COMMANDS SECTION 


STO$GO GO 

STOS$SSINGLESSTEP SINGLE STEP 

ЗТОЗЕХАМЗМЕМ SUBSTITUTE MEMORY 

SIO3EXAM$REG EXAMINE REGISTER 

SIO$MOVE MOVE 

STOSDISPLAY DISPLAY BYTES 

STOSINPUT INPUT PORT 

ЗТОЗОПТРИТ OUTPUT PORT 

ЗТОЗМЯТТЕ WRITE DATA RECORDS 

ЗТОЗНЕАО READ DATA RECORDS 
COMMAND DISPATCH (OUTER BLOCK, MAIN PROGRAM LOOP) 

МЕХТЗСОММАНО ОТЗРАТСН 

ERROR ERROR ROUTINE 


/ + 22202100 00 0 2 воа 002 009 


е СОММАМО ЗЕСТІОМ ы 
121111111111 1121 2У) 


510300: 


/9 IMPLEMENTS THE "00" COMMAND. THE USER MAY SPECIFY 
ТР: РС AND AN OPTIONAL BREAKPOINT. ?/ 

PROCEDURE; 
CALL ЗТОЗОРОАТЕЗТР; 


IF CHAR=',' THEN 


/9 BREAKPOINT 9?/ 
00; 

CALL STO$GETSCHAR; 

CALL SIO$GETS$ADDR(@BRK1,CSIP.SEG); 

ТЕ CHAR<D>ASCR THEN GOTO ERROR; 

BRKI$SAVE = МЕМОВУЗВЕК 1; 

MEMORY$BRK1 = BREAK$INST; 

IF МЕМОЯУЗВАК1<>ВЕЕАКЗТМЗТ THEN GOTO ERROR; 
BRKI3FLAG = TRUE; 

END; 


ELSE /% NO BREAKPOINT ?/ 


IF CHAR<>ASCR THEN GOTO ERROR; 


CALL SIOSCRLF; 

з CSTP.OFF; 

з CSIP.SEG; 

FL = FL AND (МОТ STEPSTRAP); 
L RESTORESEXECUTE; 


SITOSSINGLES$STEP: 


A NEW 


/% CLEAR IF SET ?/ 


/® IMPLEMENTS THE SINGLE STEP COMMAND. DISPLAYS ІР AND THE 


CURRENT INSTRUCTION ВТҮЕ. OPENS 5:19? FOR INPUT. 


DEPRESSING 


COMMA CAUSES THE MONITOR TO SINGLE STEP THE INSTRUCTION, AND 


PERIOD TERMINATES THE COMMAND. %/ 
PROCEDURE; 


PAGE 


14 


PL/M-86 COMPILER SDK86 SERIAL- MONITOR PAGE 


307 
308 
310 
311 
312 
313 
314 


319 


316 
317 
318 
319 
321 
322 
323 
324 


325 
326 
327 
328 
329 
331 
332 
333 
334 
336 
337 
338 
339 
381 


352 
343 
344 
346 
347 
348 
350 
351 


392 
353 
354 
355 
356 


357 


358 


— NN гу Јо гу го 


WWWNNN ГО ГО 


млм Е E £ O ы 2 КА) МА) КА) 


— 


fÑ КА) www Www 4 ЛА є 


CALL SIO$UPDATESIP; 
ТР СНАНС»"," THEN GOTO ERROR; 
CSIP.OFF; 
CSIP.SEG; 
FL = FL OR ФТЕРЗТНАР; 
CALL RESTORE$EXECUTE; 
END; 


Q 
а 
Син 


ЗТОЗЕХАМ$ МЕМ: 
/% IMPLEMENTS THE EXAMINE MEMORY COMMAND. %/ 
PROCEDURE; 
DECLARE W WORD; 
CALL SIO$TEST$WORD$MODE; 
CALL SITO$GET$ADDR(@ARG1,CS); 
ТЕ СНАЯ<>",!" THEN GOTO ERROR; 
DO WHILE TRUE; 
CALL SIO$OUT$BLANK; 
IF WORD$MODE THEN 
CALL SIO$OUT$WORD( MEMORY$WORDSARG1); 
ELSE 
CALL SIO$OUT$BYTE(MEMORY$ARG1); 
CALL ФТОЗОЏТЗСНАА( "-"); 
CALL SIO$OUT$BLANK; 
CALL SIO$GET$CHAR; 
IF CHAR=ASCR THEN RETURN; 
IF СНАВС»"," THEN 
00; 
W з ЭТО$ОБТ$ НОВО; 
те (CHAR <> ",") AND (CHAR <> ASCR) THEN GOTO ERROR; 
ТЕ wIROSMOSE THEN 
00; 
МЕМОВУЗИОНОЗАНОТ = W; 
ТЕ MEMORY$WORD$ARG1<>W THEN GOTO ERROR; 
END; 
ELSE 
ро: 
МЕМОВІЗАВСЇ!: = LOW(W); 
ТЕ MEMORY$ARG1<>LOW(W) THEN GOTO ERROR; 
END; 
END; 
IF CHAR=ASCR THEN RETURN; 
IF WORD$MODE THEN 
ARG1.OFF = ARG1.OFF + 2; 
ELSE 
АВСТ,ОРЕ = ARG1.OFF + 1; 
CALL SIO$CRLF; 
CALL SIO$OUT$WORD(ARG1.OFF); 
END; 
END; 


ЗІОФЕХАМЗВЕС: 

/% IMPLEMENTS THE EXAMINE REGISTER COMMAND. SCANS FOR A VALID 
REGISTER NAME AND DISPLAYS THE VALUE OF THAT REGISTER WHICH 15 
OPTIONALLY OPENED FOR INPUT. COMMA INCREMENTS TO NEXT REGISTER 
UNLESS ТТ IS "БЕ" WHICH TERMINATES AS DOES CR. %/ 

PROCEDURE; 

DECLARE (Т,1) BYTE, SAVE WORD; 


15 


Р./М-85 COMPILER 


359 
360 
361 
362 
363 
364 
365 


Г МАЈ ЧАЈ КАЈ КА) МАЈ үл) ЕЕ E + J) ЈА) КАЈ КАЈ ЈА) КАЈ Г ГО Г Г ФӘ (Q ww 42 £ £ E ЕЕ RE а) ла) Г ОМ 


— 


fN IV WM го г № г го MW MW № № 


50К86 SERIAL MONITOR PAGE 


CALL SIO$SCAN$SBLANK; 
ТЕ CHAR=ASCR THEN 
00: 
CALL STOSCRL?; 
00 1-0 ТО 13: 
CALL STO$OUTS$BLANK; 
CALL SIOSOUT$CHAR(REG(I#2)); 
CALL ЗТОЗОЦТЗСНАЯ ( НЕС(1?2+1)); 
CALL ЗТОЗОЏТЗСНАА("г"). 
CALL STOSOUT$WORD( REGS$SAV(I)); 
ТЕ [26 THEN CALL SIOS$CRLF; 


END; 

RETURN; 

END; 
IF NOT(STO$SVALID$REG$FIRST) THEN GOTO ERROR; 
T = CHAR; 


CALL ЗІОЗСЕТУСНАЯ; 
ТЕ NOT(SIO$VALID$REG(T,CHAR)) THEN GOTO ERROR; 
I = REG$INDEX; 
DO WHILE TRUE; 
CALL ЗТОЗОЏТЗСНАА( "а"): 
CALL ЗТОЗОПТЗИОНО ( НЕСЗЗАУ(Т)); 
CALL 510%00Т9СНАЯ("-"); 
CALL STO$OUTS$BLANK; 
CALL ЗТОЗСЕТЗСНАЯ; 
IF СНАН<>2"," AND CHAR<>ASCR THEN 
00; 
ЗАМЕ = SIO$GET$WORD; 
IF (CHAR <> ",' ) AND (CHAR <> АСК) THEN GOTO ERROR; 
REG$SAV(I) = SAVE; 


END; 
IF СНАН-АЗСН OR 1213 THEN RETURN; 
141441 


CALL SIO$CRLF; 

CALL SIO$OUTSCHAR( НЕС(Т?2)); 

CALL STOSOUTSCHAR(REG(I#®241)); 
END; 


END; 


ЗТОЗМОУЕ : 
/9 IMPLEMENTS THE MOVE COMMAND. ACCEPTS 3 ARGUMENTS AMD MOVES THE 


BLOCK OF MEMORY SPECIFIED ВУ ARG1-ARG2 ТО АЯСЗ. ARG2<ARG1 OR THERE 
IS A DIFFERENCE WHEN THE BYTE ІЗ READ BACK, THEN ERROR. ?/ 


PROCEDURE; 


99Р: 


CALL ЗТОЗЗСАМЗВГАНК ; 

CALL ЗТОЗСЕТЗАООН ( ЗАНС1Т,СЗ); /а FIRST ARGUMENT #/ 
ТЕ СНАЯ<>"," THEN GOTO ERROR; 

CALL SIOSGETSCHAR; 

END$SOFF = STO$GETS$WORD; /® SECOND ARGUMENT 9 
IF ENDSOFF<ARG1.0FF THEN GOTO ERROR; 

IF СНАН<>"," THEN GOTO ERROR; 

CALL SIO$GETSCHAR; 

CALL SITOSGETSADOR( ЗААСЗ, CS); /® THIRD ARSUMENT #/ 

ТЕ CHAR<>ASCR THEN GOTO ERROR; 

CALL З1032ВР: 


МЕМОЧТЗАЛОЗ = MEMORYSARGI; 


PL/M-86 COMPILER 50К86 SERIAL МОНТТОН РАЈЕ 


419 2 ТЕ MEMORY$ARG3<>MEMORY$ARG1 THEN GOTO ERROR; 
421 2 ТЕ АЯСТ.ОЄЄ = ENDSOFF THEN RETURN; 
423 2 ARG1.OFF = ARGI.OFF + 1; 
424 д ARG3.OFF = АНСОС3.0Є87 + 1; 
425 2 0919 LOOP; 
426 2 END; 
427 1 STO$DISPLAY: 
/* IMPLEMENTS THE DISPLAY BYTE COMMAND. IF CALLED WITH 1 PARM THEN 
OUTPUTS A SINGLE BYTE. ТЕ CALLED WITH 2 PARMS THEN OUTPUTS THE RANGE 
BETWEEN THE TWO ADDRESSES. ТЕ ОЕЕЗЕТ< ВЕСТЧ THEN OUTPUTS ONLY A SINGLE 
BYTE. #/ 
PROCEDURE; 
428 2 DECLARE T BYTE; 
429 2 CALL ЗТОЗТЕЗТУИОНОЗМООЕ; 
430 2 CALL SITO$GET$ADDR(8ARG1,CS); 
431 2 ТЕ CHAR=ASCR THEN 
432 2 END$OFF = ARG1.OFF; 
ELSE 
433 2 00; 
434 3 ТЕ CHAR<>',' THEN GOTO ERROR; 
435 3 CALL SIO$GET$CHAR; 
437 3 ЕМОФОРЕ = SIO$GET$WORD; 
438 3 ТЕ ЕМОЗОЕЕ < АВСТ.ОРР THEN GOTO ERROR; 
449 3 ТЕ CHAR<>ASCR THEN GOTO ERROR; 
442 3 END; 
443 2 NEWLINE: 
CALL SIO$CRLF; 
445 г CALL SIO$OUT$WORD(ARG1.0FF); 
445 2 LOOP: CALL SIO$OUT$BLANK; ' 
446 2 ТЕ WORD$MODE ТНЕМ 
цц” 2 00; 
48 3 CALL SIO$OUT$WORD(MEMORY$WORD$ARG1I); 
49 3 ТЕ АВСТ.ОЄЄ = END$OFF THEN RETURN; 
451 3 ARG1.OFF з ARG1.OFF + 1; 
452 3 END; 
ELSE 
453 2 CALL SIO$OUT$BYTE(MEMORY$ARG1); 
454 2 ТЕ ARG1.OFF>=END$OFF THEN RETURN; 
456 2 ARG1.OFF = ARG1.0FF + 1; 
457 д T = ARG1.OFF AND ОООЕН; 
458 2 IF Т=0 ОВ (WORD$MODE AND T=1) THEN GOTO NEWLINE; 
460 2 GOTO LOOP; 
461 2 END; 
462 1 ЗТОЗТНРУТ: 
/® THIS ROUTINE IMPLEMENTS THE "ТЦРиТ" COMMAND, USER ЗРЕСТЕТЕЗ 
A PORT AND THE DATUM OF THE PORT IS DISPLAYED. #/ 
PROCEDURE; 
463 2 DECLARE PORT WORD; 
464 2 CALL SIO$TEST$WORDSHODE; 
465 2 PORT = STOISGET$SWORD; 
455 2 L30P: 
Le СНАВ<У*,' THšN ШОТ) ERROR: 
453 2 GELL 3132 028ЫЕЁ: 
469 2 Ге wYROSMODE THEN 
472 2 TALL 313531754080(1440980(РЭНТ ҮҮ: 





PL/M-86 COMPILER 


SDK86 SERIAL MONITOR 


OUTPUTS LEADING NULLS, 
AND TRAILING NULLS. %/ 


, INDEX) WORD; 


FOR 8980 MODE #/ 


ELSE 
471 2 CALL 510900Т%ВТҮТЕ(ІМРУТ(РОВТ)); 
ц72 2 CALL STO$GETS$CHAR; 
473 г ТЕ CHARSASCR THEN RETURN; 
475 г GOTO LOOP; 
476 2 END; 
477 1 SIO$OUTPUT: 
/® THIS ROUTINE IMPLEMENTS THE ‘OUTPUT’ COMMAND. THE USER SUPPLIED 
DATUM IS OUTPUT TO THE SPECIFIED PORT. #/ 
PROCEDURE; 
478 2 DECLARE (DATUM,PORT) WORD; 
479 2 CALL SIO$TEST$wWORD$MODE; 
430 2 PORT = SIO$GET$WORD; 
481 2 ТЕ СНАВО»"',' THEN GOTO ERROR; 
483 2 CALL ЗТОЗСЕТЗСНАЯ; 
84 2 LOOP: 
DATUM = SIO$GETS$WORD; 
485 2 ТЕ CHAR=':' THEN GOTO ERROR; 
487 2 ТЕ WORD$MODE THEN 
438 2 OUTWORD(PORT) = DATUM; 
ELSE 
489 2 OUTPUT( PORT) = LOW( DATUM); 
499 2 IF СНАВз"',' THEN 
431 2 00; 
ц92 3 CALL SIO$CRLF; 
493 3 CALL 510400Т4СНАВ(!-"), 
494 3 CALL 51290079В0АЯҚ; 
2:5 3 CALL 512%СЕТ%СНАВ; 
пає 3 IF CHAR <> ASCR THEN GOTO LOOP; 
473 3 END; 
499 2 END; 
522 1 STO$wRITE: 
/% IMPLEMENTS THE PAPER TAPE WRITE COMMAND. 
EXTENDED ADDRESS RECORD (3086 ONLY), START ADDRESS RECORDS 
(8086 ONLY), DATA RECORDS, EOF RECORD, 
PROCEDURE; 
591 2 DECLARE (5ТАНТЗВЕС ,МООЕЗд086) BYTE, (LEN 
202 2 CALL ЗТОЗОЕТЗСНАЯ; 
123 2 MODE$8086 = TRUE; 
534 2 ТЕ СНАЯз'Х"' THEN /%* TEST 
505 г 50; 
596 3 MODE$3086 з FALSE; 
997 3 CALL ЗІОЗСЕТУСНАЯ; 
503 3 END; 
25% 2 ТЕ CHAR=ASBL THEN CALL 510%СЕТЗСНАВ; 
мт 2 CALL SIO$GET$ADOR(@ARG1I,CS); 
572 2 ТЕ СНАВ<>"," THEN GOTO ERROR; 
214 2 CALL ФТОЗЈЕТЗСНАВИ; 
515 2 END$OFF z SIO$GET$WORD; 
515 г ТЕ END$OFF<ARG1. OF? THEN GOTO ERROR; 
<18 2 IF CHAR<>ASCR THEN 
519 2 00; 
520 3 START$REC з TRUE; 
521 3 CALL SIO$GET$CHAR; 
Sez 3 CALL STO$GET$ADDR(@ARG3,CS); 


PAGE 


14 


г. /М=86 COMPILER 


223 


52 

225 
526 
ЭЕ? 
520 
5 30 


231 
532 
2239 
534 


535 
536 
537 
538 
5 39 
540 
241 
542 
543 


№ № л лә лә м МА) 


NNN о мого N м W КАЈ КАЈ Ка) КАЈ 42 EK E 42 ЕЕ ка) ГО ГО № Ww № 


Мо г юм 


г 


LOOP: 


SDK86 SERIAL MONITOR PAGE 


END; 
ELSE 

DO; 

START$REC = FALSE; 

ARG3.OFF = 0; 

END; 
ТЕ CHAR<>ASCR THEN GOTO ERROR; 
CALL SIO$CRLF; 


DO 1-1 TO 60; 79 LEADING NULLS %/ 
CALL SIO$OUT$CHAR(0O); 
END; 


CALL SIO$CRLF; 


IF MODE$3086 THEN 
DO; 
IF START$REC THEN 
DO; 
CALL SIO$OUT$HEADER(04,0,03); /% START ADDRESS RECORD #/ 
CALL SIO$OUT$WORD( ARG3.SEG); 
CALL SIO$OUT$WORD(ARG3.0FF); 
CALL 510%00Т%ВҮТЕ( CHECK$SUM); 
CALL SIO$CRLF; 
ARG3.OFF = 0; 
END; 
CALL SIO$OUT$HEADER(02,0,02); /% EXTENDED ADDRESS RECORD #/ 
CALL SITOSOUT$WORD( ARG1.SEG); 
CALL SIOSOUTS$BYTE(CHECK$SUM) ; 
CALL SIO$CRLF; 
END; : 
СЕМ з STANDARD$LEN; ие DATA RECORD #/ 
INDEX = END$OFF - ARG1.0FF; 
IF INDEX<STANDARD$LEN THEN LEN = INDEX + 1; 
CALL SIO$OUT$HEADER(LEN,ARG1.0FF,00); 
DO 1-1 TO LEN; 
CALL SIO$OUTS$BYTE(MEMORY$ARG1); 
ARG1.OFF = ARGI.OFF + 1; 
END; 
CALL SIO$OUT$BYTE(CHECK$SUM); 
CALL SIO$CRLF; 
IF END$OFF<>ARG1.OFF-1 THEN GOTO LOOP; 


CALL STO$OUT$HEADER(00,ARG3.0FF,01); /% EOF RECORD %/ 
CALL ЗТОЗОПТЗВУТЕ ( CHECK3SUM) ; 
CALL SIO$CRLF; 


00 1-1 то 60; /% TRAILING NULLS #/ 
CALL ЗТОЗОПТЗСНАН(О); 
END; 
END; 
SIO$READ: 
/% IMPLEMENTS THE READ PAPER ТАРЕ COMMAND. */ 
PROCEDURE; 


DECLARE BIAS WORD, (REC$TYPE,LEN,I,T) BYTE, OFFSET WORD; 
BIAS = 0; /* DEFAULT BIAS ®/ 


19 


Р,/М-85 COMPILER SDK86 SERTAL MONITOR PAGE 


013 
614 
915 
616 
617 
518 
613 


ом м NNW ХАА АЈ 22 ГО ГО (Q ӘӘ. МО О А МОМ Го № 


Го N а — -а — см 


-. — --з — 


- -ð -а 


ARG1.SEG = 0; /* DEFAULT CS FOR 3080 FORMAT FILE #/ 
CALL STO$SCANSBLANK; 
ТЕ CHAR<>ASCR THEN BIAS = SIO$GET$WORD; 
ТЕ CHAR<>ASCR THEN СОТО ERROR; 
CALL STIO$CRLF; 
LOOP: 
DO WHILE SIO$READSCHAR<>':';3END; 
CHECK$SUM = О; 
LEN = SIO$READ$BYTE; 
OFFSET = ЗТО$АБАОЗ НОВО; 
АВСТ.ОРР = OFFSET + BIAS; 
RECSTYPE = ЗТОЗВЕАО$ВУТЕ; 
ТЕ ВЕСЗТУРЕ=ОЗ THEN /% START ADDR ТУРЕ %/ 
00; 
С5 
ТР 
END; 
IF ВЕСЗТУРЕ=Ог THEN /8 EXTENDED ADDR ТҮРЕ #/ 
ARG1.SEG = STO$READ$WORD; 
ТЕ REC$TYPE = 91 THEN /% БОР %/ 
ТЕ OFFSET <> 0 THEN ІР з OFFSET; 
ТЕ REC$TYPE=00 THEN /9 DATA ТУРЕ #/ 
DO 121 TO LEN; 
T,MEMORYSARG1 = 510%ПЕАО%ВҮТЕ; 
IF MEMORY$ARG1<>T THEN GOTO ERROR; 
ARG1.OFF = ARG1.OFF + 1; 
END; 
T = SIO$READSBYTE; /% FETCH CHECKSUM ®/ 
ТЕ CHECK$SUM<>0 THEN GOTO ERROR; 
IF REC$TYPE<>01 AND LEN<>0 THEN GOTO LOOP; 
CALL 510500Т5СНАВ(0), /% DELAY FOR LAST CR, LF SENT ®/ 
CALL 519300Т5СНАВ(0), /% BY INTELLEC 77 
ЕНО; 


SIO$SREAD$WORD; 
SIO$READ$WORD; 


/ + ага 1010 10 тонова аа ааа 


и COMMAND DISPATCH MAIN PROGRAM LOOP ? 
9:888:83982092328:482099242040883081:44442308842234084/ 


DISABLE; 
ОПТРИТ ( КВЗЗТАТЗРОНТ ) 
OUTPUT(KBSSTATS$PORT) 
OUTPUT(KBSSTAT$PORT) 
DO 1:0 TO 7; 

OUTPUT(KBSDATASPORT) = KB$SIGNON(I); 
END; 


КВЗІМІТУМООЕ; 
KBSINIT$SCAN; 
908; /% OUTPUT "8086" SIGNON BACKWARDS */ 


/9 THIS STRANGE SEQUENCE OF CODE Т5 USED TO GUARANTEE CORRECT USART 
INITIALIZATION AFTER EITHER: 1) HARDWARE RESET (EXPECTING MODE) 
2) SOFTWARE RESTART (EXPECTING COMMAND). #/ 


OUTPUT(SIO$STAT$PORT) = SIO$S251$RESET; 
CALL 5198825185ЕТТСТНОЗОБСАТ; 
ОПТРИТ ( ЗТОЗЗТАТЗРОЯТ) = 25H; 
CALL 5103825 135ЕТТ! ТНОЗОЕГАТ; 


з OUTPUT(SIOSSTAT$SPORT) = 5105325 14НЕЗЕТ ; 


CALL STO$S2513SETTLUINGSOELAY ; 


PL/M-36 COMPILER 


625 
627 
628 
629 
639 


631 
632 


633 
634 
635 
636 
637 
638 


639 


562 


663 


564 


=» — М № ә са са са 


— Ә ӘМ ӘӘ {М А ГО Г) О А = 


— 


SDK86 SERIAL MONITOR PAGS 21 


OUTPUT(SIO$STAT$PORT) = SIO0$3251$%$MODE; 

CALL SIO$3251$SETTLING$DELAY; 

OUTPUT(SIO$STAT$PORT) = SI0$3251$CMND; 

CALL SIO$3251$SETTLING$DELAY; ° 
CALL 510%007%5ТВІМС( 951095128083; 


/% INITIALIZE USER'S REGISTERS %/ 
65,55,05,Е5,ҒЬ,ІР з O; 
ЗР = USER$INIT$SP; 


/9 INITIALIZE INTERRUPT VECTORS #/ 

CALL INITS$INTS$VECTOR( @INT$VECTOR(1),.INTERRUPTISENTRY); 
CALL INITS$INTS$VECTOR( @INT$VECTOR(2),. INTERRUPT3$ENTRY); 
CALL INIT$INT$VECTOR( @INT$VECTOR(3),.INTERRUPT3SENTRY); 


BRKI$FLAG = FALSE; 2. 
MONITOR$STACKPTR = STACKPTR; 
MONITOR$STACKBASE = STACKBASE; 


NEXT$COMMAND: 


/% 


THIS IS THE PERPETUAL COMMAND LOOP WHICH DISPATCHES TO EACH 
COMMAND WHICH IS A SEPARATED PROCEDURE. %/ 


CALL STO$CRLF; 
CALL 510500Т5СНАВ(0), 
CALL SIO$OUT$CHAR('.°); 
CALL SIO$GET$CHAR; 
00 1:0 TO LAST(SIO$CMND); 
IF CHAR=SIO$CMND(L) THEN GOTO DISPATCH; 
END; 
GOTO ERROR; | 


DISPATCH: 


ERROR: 
ла 


LAST$COMMAND = I; 

DO CASE I; 
CALL SIO$EXAM$MEM; 
CALL SIO$EXAM$REG; 
CALL SIO$GO; 
CALL SIO$SINGLE$STEP; 
CALL SIO$MOVE; 
CALL SIO$DISPLAY; 
CALL SIO$INPUT; 
CALL SIO$OUTPUT; 
CALL SIO$READ; 
CALL SIO$WRITE; 

END; 

GOTO NEXT$COMMAND; 


THIS ROUTINE HANDLES ALL ERRORS DETECTED BY THE МОМІТОЯ AND 
WILL OUTPUT THE ERROR PROMPT TO THE OUTPUT PORT. %/ 


CALL ЗТОЗОПТЗСНАН( "#"); 
GOTO NEXT$COMMAND; 


AFTERSINTERRUPT: 


. 


THIS ROUTING 15 CALLED AFTER AN INTERRUPT ТО DISPLAY THE С 
AND ЯЄЗТОЯЄ THE BREAKPOINTED INSTRUCTION. */ 


“Те 


ГД 


РІ/М-25 COMPILER 50535 SERIAL MONITOR 


ТЕ BRKI$FLAG THEN 
DO; 
MEMORY$BRK1 = BRKI$SAVE; 
BRKISFLAG = FALSE; 
ТЕ ((ІР-1) AND 000ЕН)-(88К1,О0ЕР AND ОООЕН) AND 
(ЭНЕ(ІР-1,43»С5)-( ЭНЕ(ВВК1.ОЕҒ,Ш 3 “ВЕК1.5ЕС) THEN 
D9; 
IP з IP ~ 1; 
CALL SIO$OUT$š$STRING(ƏSIO$BREAK$WSG); 
END; 
END; 
CALL SIO$OUT$CHAR('8'); 
CALL ЗТОЗОПТЗИОНО( СЗ); 
CALL SIO$OUTSCHAR(':'); 
CALL STO$SOUTS$SWORD( ТР); 
GOTO МЕХТЗСОММАМО; 


~ Gy ut 


с 
МА -а 


J. c .” 


а N за ~ 3 
tas y J а & АЈ Ёс -— 


4 


— а — „а — СО цд) АА хэ! № 


слу «Зу OY че бо, te O. 


« 
л 
чә 
= 


ЄМО МОМІТОЯ; /% END OF MODULE ®/ 
EOF 


422005 INFORMATION: 


CODE AREA SIZE QF DBH 40590 


CONSTANT AREA SIZE = 0000H 00 
VARIABLE AREA 3122 = 29738 1200 
MAXIMUM STACK 5125 з 2942H 650 
1211 LINES READ 


0 PROGRAM 21829. 3: 


END OF Р,/М-35 СОМ? АТТОН 


х 





SDK-86 SERIAL MONITOR 
EXPANDED SOURCE LISTING 






Р /М-86 COMPILER SDK86 SERIAL MONITOR PAGE 1 





1515-11 PL/M-86 91.1 COMPILATION OF MODULE MONITOR 

NO OBJECT MODULE REQUESTED 

COMPILER INVOKED BY: PLM86 :£1:SERIAL.PLM LARGE OPTIMIZE(2) PAGEWIDTH(95) & 
CODE XREF NOOBJECT PRINT(:F1:SERIAL.PRT) 


$TITLE(*SDK86 SERIAL MONITOR’) 
$NOINTVECTOR 


/а пои ооо ооо о ваа звоно везао оа ваа аа 90 22218206 
ооо ооо ооо сво ооо ос ооо ово нон ооо но 8 0.8 06 


50К-86 MONITOR, V1.2 
06 AUGUST 1979 


(С) 1978 INTEL CORPORATION. ALL RIGHTS RESERVED. NO PART 
OF THIS PROGRAM OR PUBLICATION MAY BE REPRODUCED, TRANSMITTED, 
TRANSCRIBED, STORED IN A RETRIEVAL SYSTEM, OR TRANSLATED INTO ANY 
LANGUAGE, IN ANY FORM OR BY ANY MEANS, ELECTRONIC, MECHANICAL, 
MAGNETIC, OPTICAL, CHEMICAL, MANUAL OR OTHERWISE, WITHOUT THE PRIOR 
WRITTEN PERMISSION OF INTEL CORPORATION, 3065 BOWERS AVENUE, SANTA 
CLARA, CALIFORNIA, 95051. 


ооо ооо ооо вв ваа ава аа ааа ааа аа вана аа ааа ова ааа ваа а ERS 


ABSTRACT 


THIS PROGRAM IS THE ROM BASED SERIAL MONITOR FOR THE 50К-86. ТТ 
PROVIDES THE USER WITH A MODERATE LEVEL OF CAPABLILITY TO 
EXAMINE/MODIFY MEMORY AND REGISTERS, CONTROL PROGRAM EXECUTION, 
AND LOAD/SAVE PROGRAMS. 


ENVIRONMENT 


THE SDK SERIAL MONITOR COMMUNICATES WITH THE USER УТА AN INTERACTIVE 
TERMINAL (TTY,CRT) ATTACHED TO THE SERLAL PORT. 


PROGRAM ORGANIZATION 


THE PROGRAM IS DIVIDED INTO 1 DATA AND 2 CODE MODULES: 


1. DATA DECLARATION MODULE. GLOBAL DATA DECLARATIONS. 
2. COMMON ROUTINES. LOWER LEVEL PROCEDURES 
3. COMMAND MODULE. INDIVIDUAL COMMANDS AND OUTER BLOCK 


CALLING GRAPH 


>> СОММАМО DISPATCH MODULE (OUTER BLOCK) 
INDIVIDUAL COMMAND PROCEDURES 
COMMON ROUTINES 


GLOBAL DATA STRUCTURES 


THE MONITOR MAINTAINS THE USER'S MACHINE STATE (REGISTERS) IN А 
WORD ARRAY. THE REGISTERS ARE SAVED FROM THE USER'S STACK 
AS PUSHED BY PLM86 INTERRUPT PROCEDURE. 


PL/M=-86 COMPILER 


SDK86 SERIAL MONITOR PAGE 


POINTERS TO THE 50К-46 29920 ADDRESS SPACE ARE IMPLEMENTED WITH 


POINTER STRUCTURES ALLOCATED AS 2 WORD STRUCTURES. 
»/ 
MONITOR:DO; /% BEGINNING OF MODULE #/ 
ла поборов ооо ооо иона ооо оо ооо о оно зоте 
оно ооо оао 555555552525 5 555 2 ои 213114 
GLOBAL DATA DECLARATIONS MODULE 
ABSTRACT 
THIS MODULE CONTAINS ALL THE GLOBAL DATA DECLARATIONS AND 
LITERALS (EQUATES), 
MODULE ORGANIZATION 
2222222222:2222222222 
THE MODULE IS DIVIDED INTO 5 SECTIONS: 
1. UTILITY SECTION GLOBAL FLAGS, VARIBLES, EQUATES 
2. 1/0 SECTION 1/0 PORTS,MASKS,AND SPECIAL CHARS 
3. MEMORY ARGUMENTS SECTIONS STRUCTURES FOR POINTERS 
4. REGISTER SECTION USER REGISTER SAVE AREA 
5. BOOT AND 8089 SECTION BOOTSTRAP AND 8089 DESCRIPTOR 
8 / 
/ % 24 001 2 з0 10 10 ваа ааа аа 7. 
. UTILITY SECTION * 
тете рев авт ре гв рата / 
2 1 DECLARE 
INTSVECTOR(5) POINTER; /* INTERRUPT VECTORS #/ 
+“ DECLARE 
MONITORSSTACKPTR WORD, 
MONITORSSTACKBASE WORD; 
ü | DECLARE 
COPYRIGHT(®) ВҮТЕ DATA ("(С) 1978 INTEL CORP’); 
5 4 DECLARE 
BRK 1$FLAG BITE, /* TRUE ТР BREAK SET #/ 
BRK 1$SAVE BYTE, /* INST BREAK SAVE #/ 
CHAR BYTE, /% ONE CHAR LOOK AHEAD 9/ 
CHECK$SUM BYTE, /% PAPER TAPE CHECKSUM */ 
Т ВҮТЕ, /% INDEX */ 
ENDSOFF WORD, /* END OFFSET ADDRESS %/ 
WORD$MODE BYTE, /% WORD MODE FLAG */ 
LASTS3COMMAND BYTE; /% LAST COMMAND SAVE */ 
ó 1 DECLARE 
TRUE LITERALLY ‘OFFH’, 
FALSE LITERALLY ‘OOOH’, 
BREAKSINST LITERALLY ‘CCH’, /% BREAKPOINT INST %/ 
ЗТЕРФТВАР LITERALLY '01008', /% SS TRAP FLAG MASK */ 
USER$INIT3$SP LITERALLY '100Н', /% USER STACK INITIAL */ 
GO$COMMAND LITERALLY "2", /% GO COMMAND CODES %/ 
SS$COMMAND LETERALLY "3", /% SINGLE STEP CODE #/ 
STANDARD$LEN LITERALLY "16", /8 PAPER TAPE DATA REC LEN */ 
MAXS$OELAY LITERALLY "10000"; /% DELAY FOR PAPER ТАРЕ #/ 


2 


“ (нидафатсо лноияие) LW 
- (даном DZS ‘аном 330) JYNLƏNYIS 8152 
Из ОНОМ 41 5 52 ги “43185104 Н144415241МОНЗИ 


“5118 81495: 864 1НОНЗН 03548 | ЯНВЗЛАНОИЯЙ 
“(81491389 1МО0нНЗН0) iV 
(ОНОМ DAS ‘AYOM 440) ZUNLƏNYIS туча 
ѓа + ЗОН a7 “34315104 61461 ИНЕЗАНОИЗИ 


SLAG YLdSLOUVSAYOWSW 03548 &ОНУ$АНОНЗИ 
"«ніафронувфіномяне) LY 

«сном DAS ‘аном 440) IYNLƏNULS ЕОНУ 

/а Е ІКЗИПОЧНУ ал “43185104 Н14$%ЬОНУ$АНОНЗИ 


“аном Н148 | ОНУЗАНОКЯЙ G3SV8 | ОНУЗОНОМФ АНОИЗИ 

‘JLAG ULdFLOUVSAYOWSW CASVE | ОНУФАНОИЯЙ 
""ніафронуфінонзив) LV 

(даном 035 "ЯНОМ 330) ЯНП1ОПН1$ 19НУ 

/а | ЈАЗАПОНУ ь/ ‘USLNIOd Н14$15НУ$АНОНЯН 


7886868668080888948008048080008:800:! 
. NOILORS ІКЗИПОНУ ХМОНЗИ 


стагсевае та сс в ава 58:46: 52388218 ае 
/а 30У46 НО ЯКУ"Я ь/ “.НО2д,  Х717783117 18<у 
ѓа 1333 3617 «/ "НУО, АЛ1ЛУНЗ3117 ‚ 8154 
/а МЫПЇЯН ЗОУТННУЈ 4/ “ына0. 147171083117 о] АЈ 
/ ж aly% NVOS SWOL e/ > Н6Е, ATIWHSLIN NVOS$LINI$EH 
/а 1108001 АЗУ 2 “340023 
‘XYLNS 1331 "11878 8 ги ‘HOO, Х77783117 ЗаОй 1 Т КТ ЕЯ 
/. 1804 У1У0 гл “.Н893440, АЛПЛПҮНЗ11П ін04%уі1Уа%8» 
/а 1804 GNYWKOD/SNLIVIS ь/ е НУЗ430, Х717783117 18084%1715%89 
/и KidW3 H33308 LIWX +/ s „НО, AVIWUSLI1 XKGUXL$OIS 
/а Ххаузн У1У4 ЗЛІЗОЗН ь/ ",нго, Х7171783117 XquxXxutoIS 
а ХЧУЗН 135 9190 ь/ “Нов, ІЗЗУНЗЦІІ7 1484544015 
/ь КО 810 108 ANRO SV IWYS e/ „Него, KVIVUSLIIT МОФН149:65204015 
/ 330 4194 ми "ного, 117ҮнН3111 а8Н241:6528640165 
/а З00И ОМАСУ а/ 8320. Х171783117 Зак | 28 015 
/e ОКУИКОО 13558 e/ “.Н690. ІЗЗУН3111 136538%16208%016 
/а 1808 10481 VIVO а/ " ,НО4430, Х77783117 1804%У1У0%016 
/а 1804 LNdNI 501415 в/ г „Неа3 30, Х717783117 1808%1715%015 
/и ІЧУЄП 1929 ь/ 


/008868064684884080089844888446084806084 
О NOILOSS 6М011У8У7230 0/1 


4088.81.68: 980 4 558150 408486 6... 108 
“(,МНО10ННЭОХб,) Viva 3118 (ж) ОМИ2$015 
"(,33408)68.995п5210,) ViVa зала (а) ТТОСУ 
кс“ e ЦА “МО11МСИ 98-345.“НҮС“Н0а0) УУС зала (6)М5МО0М901548016 
"(0", YE.) УРУС SLAG (se )OSWSHVSNESOIS 

/ а и Б 9 "| С и а/ 
‘ноо ‘нос ‘Нз ‘Но HOO HOO H98'HgS) УШУП 3148 («) КОКОТС ВИ 


зоуа YOLINOW "ЗУ18258 0693 


анупоза 


s... 
Ззнуп0за 01 
ЗНУЛОЗО Е 
знулоза t 
га... 

. 
.../ 
ЗНУЛО ЗС 4 
ПЕ УЗ114н00 9р-н/ла 


PL/M-86 COMPILER SDK36 SERIAL MONITOR PAG 


МЕМОКУЗСЗТР BASED МЕМОНУЗСЗТРЗРТА BYTE, 


МЕМОЯУ ОЗЕЯЗТАСК$ РТА POINTER, 
USERSTACK STRUCTURE (OFF WORD, SEG WORD) 
АТ (@MEMORYSUSERSTACK$PTR), 
MEMORY$USERSTACK BASED MEMORY$USERSTACKSPTR WORD; 


/ + 2022 220 0020 2010 009002022120 


ы REGISTER SECTION в 
паавававававававава га аа / 


12 1 DECLARE 

REG(#) BYTE DATA /* REGISTER NAMES 9?/ 
(*AXBXCXDXSPBPSIDICSDSSSESIPFL’), 

REG$INDEX WORD, 

REG$SAV(14) WORD, /9 USER’S SAVED REGS ?/ 

НЕСЗОВО( 3) BYTE DATA 
(7,6,1,3,2,0,9,11,12,8,13), 

SP LITERALLY ‘REG$SAV( Ц)’, 

BP LITERALLY " НЕСЗЗАУ( 5)", 

СЗ LITERALLY 'REG$SAV( 8)", 

05 LITERALLY “ВЕСӚ5АУ( 9)", 

55 LITERALLY " ВЕОЗЗАУ( 10)", 

Е5 LITERALLY " ВЕСЗЗАУ( 11)", 

LP LITERALLY 'REG$SAV(12)', 

PL ` LITERALLY 'REG$SAV(13)'; 


/ + 1000000 000020 за ааа ааа ааа аа ааа аа аа за 


, BOOTSTRAP JUMP AND 8089 VECTOR a 
8889288988988988588988889988888988899898 / 


/9 THIS BOOT CONSISTS OF A LONG JUMP ТО THE BEGINNING OF THE MONITOR 

АТ ЕЕОО„ХХХХ WHERE ХХХХ IS THE STARTING ADDRESS OFFSET (ТР) AND 

MUST BE DETERMINED AFTER EACH COMPILE. ?/ 

13 1 DECLARE 

START$ADDR LITERALLY 'OOQA8H', /% STARTING ADDRESS %/ 
воот1(%) BYTE АТ (OFFFFOH) DATA (ОБАН), /% LONG JUMP OPCODE %/ 
BOOT2(*) WORD АТ (ОҒҒЕҒІН) DATA (START$ADDR), 
BOOT 3( *) WORD АТ (OFFFF3H) DATA (OFFOOH); /% SEGMENT ADDRESS! ?/ 


/% THIS TWO-WORD DATA IS A JUMP TO THE STARTING ADDRESS AND IS LOCATED 
AT THE FIRST LOCATION OF ROM (NO OTHER DATA OR CONSTANT DECLARATIONS 
MAY PRECEDE ІТ). THE JUMP IS ACTUALLY ТО (5ТАНТ-АрОН!)!-4 SINCE THE 
INSTRUCTION IS A RELATIVE JUMP OF LENGTH 3. ?/ 
14 1 DECLARE 
800Т4(9) WORD DATA (OE990H,START$ADDR=-4); /% МОР,ЈМР START-ADDR */ 


/8 THIS BLOCK OF ROM АТ FFFF6-FFFFA IS INITIALIZED FOR THE 8089 
DEVICE AND POINTS ТО A BLOCK OF RAM AT 0100H. #/ 
15 1 DECLARE 
BLOCK$8089 WORD АТ (OFFFF6H) DATA (00018), 
BLOCKS8089G$PTR POINTER АТ (OFFFF8H) DATA (00100Н); 


оао очен ез ле іе аі ғ ж) 


š FILL DECLARATIONS SECTION ? 
оо зао ана а га ваа ааа аа за а 888 / 


PL/M-86 COMPILER 


29 


26 


27 
28 


29 


31 


32 


33 


36 


37 
38 


02C1 


02C3 
0208 


О2СА 
02CD 
02СҒ 


0201 
0204 
0205 
0207 


O2DA 
огрс 


‘O2DE 


02Е1 


02E3 
92Е8 
02ЕА 


02Ер 
ОФЕЕ 


02EF 
02F0 


02F2 
02F5 
02F7 


02F9 


SDK86 SERIAL MONITOR PAGE 
7520 JNZ @2 
DO WHILE CHAR<>11H; /% CONTROL=Q * / 
: STATEMENT # 25 
8121: 
803E660011 CMP CHAR,11H 
7423 JZ 85 
ТЕ SIO$CHAR$RDY THEN 
; STATEMENT й 26 
E8D3FF CALL SITOCHARRDY 
0008 АСЕ АС, 1 
7362 JNB 8121 
DO; 
CHAR = INPUT(SIO$DATA$PORT) AND O7FH; 
; STATEMENT # 28 
BAFOFF MOV ОХ, ОЕЕЕОН 
ЕС ТМ ОХ 
2472 AND AL ТЕН 
A26600 MOV CHAR, AL 
IF CHAR=03H THEN GOTO ERROR; 
; STATEMENT # 29 
3с03 СМР AL, 3H 
7503 JNZ $+5H 
EX925FF JMP ERROR 
END; 
END; 
; STATEMENT # 32 
EBEO JMP @121 
82: 
ELSE IF CHAR = O3H THEN GOTO ERROR; 
; STATEMENT # 33 
803E660003 CMP СНАВ,ЗН 
7503 JNZ $+5H 
E919FF JMP ERROR 
; STATEMENT # 35 
85: 
END SIO$CHECK$CONTROL$CHAR; 
; STATEMENT # 35 
5D POP BP 
СЗ RET 
SIOCHECKCONTROLCHAR ENDP 
SIO$OUT$CHAR: 
: STATEMENT # 36 
/% THIS ROUTINE OUTPUTS THE INPUT PARAMETER TO THE USART OUTPUT 
PORT WHEN USART IS READY FOR OUTPUT (XMIT BUFFER EMPTY). %/ 
SIOOUTCHAR PROC NEAR 
55 PUSH BP 
8BEC MOV ВР, ЭР 
PROCEDURE(C); 
DECLARE C BYTE; 
IF SIO$CHAR$RDY THEN CALL SIO$CHECK$CONTROL$CHAR; 
; STATEMENT # 38 
E8ABFF CALL SIOCHARRDY 
DOD8 RCR AL,1 
7303 JNB 0123 
; STATEMENT # 39 
ЕВВТЕЕ CALL SIOCHECKCONTROLCHAR 


24/М-35 COMPILER 


40 


42 


43 


4% 


45 


48 


50 


О2ЕС 
02ҒҒ 
0390 
0302 


0394 
9397 
ОЗОА 


0308 
930C 


ОЗОЕ 
0310 


9312 
0315 
0316 
0318 


ОЗТА 
0310 
931Е 
9320 


0323 
9325 


9387 
0328 


0325 
032F 


SDK86 SERIAL MONITOR 


PAGE 


DO WHILE (INPUT(SIO$STAT$PORT) AND SIO$TXRDY)=z2); END; 


; STATEMENT # 140 


8123: 
BAF2FF MOV DX,OFFF2H 
EC IN DX 
4801 TEST АБ, ІН 
7ЦЕВ 42 9123 
ОЧТРУТ(ЗІОФОАТАФРОВТ) з С; 
; STATEMENT # 42 
ВАРОРЕ MOV DX,OFFFOH 
344604 MOV AL, ВР].С 
EE OUT DX 
END; 
; STATEMENT # 43 
5) POP BP 
с20200 RET гн 
SIOOUTCHAR ENDP 
510%5ЕТ%СНАВ: 
; STATEMENT # 44 
/® THIS ROUTINE INPUTS A CHARACTER FROM THE INPUT PORT AND RETURNS 
WITH IT IN THE GLOBAL "СНАА", THE CHARACTER IS ECHOED TO THE 
OUTPUT PORT IF PRINTABLE. 9/ 
SIOGETCHAR PROC NEAR 
55 РИЗН ВР 
ВВЕС MOV ВР,5Р 
PROCEDURE; 
DO WHILE (INPUT(STOSSTAT$PORT) AND SIO$RXRDY)=0;END; 
; STATEMENT # 45 š: 
8125: 
ВАЕ2ЕР MOV DX,OFFF2H 
EC IN DX 
A802 TEST AL,2H 
7%4Е8 JZ 8125 
CHAR = INPUT(SIO$DATA$PORT) AND O7FH; 
; STATEMENT # 47 
BAFOFF MOV DX,OFFFOH 
EC IN DX 
2Ц7Е AND AL,7FH 
A26600 MOV CHAR,AL 
ТЕ CHAR>=ASBL THEN CALL 510300Т545СНАЯ( CHAR); 
; STATEMENT # 43 
3020 СМР AL,20H 
7207 JB 88 
; STATEMENT # 49 
ЕЕЗ56500 PUSH CHAR s 4 
ЕВС1ЕЕ CALL STOOUTCHAR 
83: 
END; 
: STATEMENT # 52 
50 РОР BP 
СЗ RET 
ЗІОСЕТСНАЯ ENDP 
STOSOUT$SBYTE: 


; STATEMENT # š: 


/® THIS ROUTINE OUTPUTS THE SINGLE [INPUT PARAHETER ТО THE USART 


8 


PL/M-86 COMPILER 


5Ц 


55 


56 


57 


58 
59 


60 


61 


SDK86 SERIAL MONITOR 


IN ASCII HEXADECIMAL FORMAT. %/ 


STOOUTBYTE 
0330 55 PUSH 
0331 8BEC MOV 


PROCEDURE(B); 
DECLARE B BYTE; 


PROC NEAR 
BP 
BP,SP 


CALL SIO$OUT$CHAR(ASCIT(SHR(B,4) AND OFH)); 


: STATEMENT # 53 
Во, ВРЈ.В 
CL,4H 
BL,CL з 
BL,OFH 
ВН, ОН 
СЗ: АЗСТТ BX] 
SIOOUTCHAR 


CALL SITO$OUT$CHAR(ASCII(B AND OFH)); 


; STATEMENT % 54 
BL,£BP].B 
BL,OFH 
Вн, ОН 
СЗ: АЗСТТГ BX] 
SIOOUTCHAR 


; STATEMENT # 55 
AL,[BP].B 
CHECKSUM, AL 


; STATEMENT # 56 
BP 
2H 
ENDP 


0333 8A5E04 MOV 
0336 B104 MOV 
9338 D2EB SHR 
033A 80ЕЗОҒ AND 
0330 8700 MOV 
ОЗЗЕ 2EFF773E PUSH 
0343 E8A9FF CALL 
0346 8A5E04 MOV 
0349 80E30F AND 
034С 8700 MOV 
ОЗЧЕ 2EFF773E PUSH 
0352 E89AFF CALL 
CHECK$SUM = CHECK$SUM - 8; 
0355 8A4604 MOV 
0358 28066700 SUB 
END; 
035C 5D POP 
0350 С20200 RET 
51000ТВҮТЕ 
SIO$OUT$WORD: 


; STATEMENT # 57 


/% THIS ROUTINE OUTPUTS THE INPUT PARAMETER AS ü ASCII HEXADECIMAL 
CHARACTERS TO THE USART OUTPUT PORT. #/ 


STOOUTWORD 
0360 55 PUSH 
0361 8BEC MOV 


PROCEDURE(W); 
DECLARE W WORD; 


PROC NEAR 
BP 
ВР,5Р 


CALL SIO$OUT$BYTE(HIGH(W)); 


; STATEMENT # 59 
АХ,ГВРЈ.И 
AL, AH 
AX . 1 
SIOOUTBYTE 


; STATEMENT # 60 
АХ,ГВРЈ.И 
АХ 4271 
ЗТООПТВУТЕ 
; ЗТАТЕМЕХТ й 61 
ВР 


0363 8B4604 МОУ 
0366 88ЕО МОУ 
0368 50 PUSH 
0359  ЕВСЦЕЕ CALL 
CALL SIO$OUT$BYTE(LOW(W)); 
036C 8B4604 MOV 
036Е 50 PUSH 
0370  ЕЗВОЕЕ CALL 
END; 
0373 5D POP 
0374 с20200 RET 


STOOUTWORD 


2H 
ENDP 


PL/M-86 COMPILER SDK86 SERIAL MONITOR PA 


62 


«м 
КАЈ 


64 


65 


69 


TO 


(4 


~ 


SIOSOUTS$BLANK: 
; STATEMENT # 62 
/9 THIS ROUTINE OUTPUTS ONE BLANK. 9/ 


STOOUTBLANK PROC NEAR 
0377 55 PUSH BP 
0378 8ВЕС MOV BP,SP 


PROCEDURE; 
CALL ЗТОЗОПТЗСНАН( АЗВЕ); 
; STATEMENT # 53 


ОЗТА 8020 MOV AL,20H 
037С 50 PUSH AX 1 
0370 E86FFF CALL 51000ТСНАН 
ЕМР, 
; STATEMENT 9 64 
0383 5р РОР ВР 
0381 C3 ВЕТ 
STOOUTBLANK ENDP 
SIOSOUTSSTRING: 


; STATEMENT # 65 
/% OUTPUTS A STRING POINTED TO BY THE FIRST PARM. 9/ 


STOOUTSTRING PROC NEAR 
0382 55 PUSH BP 
0383 8BEC MOV BP,SP 


PROCEDURE( PTR); 
DECLARE PTR POINTER, STR BASED PTR (1) BYTE; 
L з 9% 
; ЗТАТЕМЕМТ # 57 
0385  с606680000 MOV Т, ОН 
DO WHILE STR(I)<>0; 
; STATEMENT # 58 


06127: 
038A 406890 MOV AL,I 
0380 8400 MOV AH,OH 
ОЗВЕ 89С6 MOV SI,AX 
0391 C4SEO4 LES ВХ,(ВР).РТЯ 
0394 26823800 СМР ES:(BX].STR(SIJ,0H 
0393 7417 44 8128 


CALL STOSOUT$CHAR(STR(I)); 
; STATEMENT # 69 


039A 406800 MOV AGT 
0390 8400 MOV AH,OH 
039F 39С6 MOV 51,АХ 
03А1 СЦБЕОЦ LES ВХ, (ВР].РТЯ 
ОЗАЦ 26FF30 PUSH Е5:(18Х1.5Т8Я(51) 
0347 Е8Ш5ҒЕ CALL SIOOUTCHAR 
[L = [I 5 1; 
; STATEMENT # 70 
O3AA 8006680001 ADD І,ІН 
END; 
; STATEMENT 4 71 
O3AF EBD9 JMP 9127 
9128: 
END; 


; STATEMENT #72 
1387 50 РОР ВР 


Р'./М-35 COMPILER 50К35 SERIAL MONITOR 
0382 020400 RET 4H 
STOOUTSTRING ENDP 
12: STOSOUT$SHEADER: 


73 


та 


81 


82 


83 


: STATEMENT # 73 
/9 THIS ROUTINE OUTPUTS THE PAPER ТАРЕ HEADER CONSISTING OF ":" 
FOLLOWED BY THE RECORD LENGTH, LOAD ADDRESS, AND THE RECORD TYPE. 
IT INITIALIZES THE CHECKSUM TO ZERO. ?/ 


STOOUTHEADER PROC NEAR 
0385 55 PUSH BP 
0386 8BEC MOV BP,SP 


PROCEDURE(LENGTH,LOAD$ADDR,REC$TYPE); 
DECLARE (LENGTH,REC$TYPE) BYTE, LOAD$SADDR WORD; 
CALL ЗТОЗОПТЗСНАН(":"); 
; STATEMENT # 75 


0388 ВОЗА MOV AL, ЗАН 
ОЗВА 50 PUSH AX ; 1 
ОЗВВ E831FF CALL 51000ТСНАВ 


СНЕСК$50М = 0; 
; STATEMENT # 76 
ОЗВЕ  С606670000 MOV CHECKSUM, ОН 
CALL ЗТОЗОПТЗВУТЕ ( LENGTH); 
; STATEMENT # 77 
ОЗСЗ FF7608 PUSH (BP].LENGTH; 1 
0366 Е867ҒЕ CALL 51000ТВҮТЕ 
CALL SIO$OUT$wORD(LOAD$ADDR); 
; STATEMENT й 78 
0309 FF7606 PUSH (BP].LOADADDR; 1 | 
ОЗСС E891FF CALL SLOOUTWORD 
CALL SIO$OUT$BYTE(REC$TYPE); 
; STATEMENT # 79 


ОЗСЕ FF7604 PUSH (BP).RECTYPE;. 1 
0302 ЕВ5ВЕЕ CALL SIOOUTBYTE 
END; 
; STATEMENT # 80 
0305 5D POP BP 
0306  с20600 RET 6H 
SIOOUTHEADER ENDP 


SIO$8251$SETTLINGS$DELAY: 
; STATEMENT # 31 
/* THIS DELAY ROUTINE ALLOWS THE USART SUFFICIENT TIME 
TO SETTLE AFTER WRITE OPERATIONS. ®/ 


SI108251SETTLINGDELAY PROC NEAR 
03D9 55 PUSH BP 
ОЗРА 8BEC MOV BP,SP 
PROCEDURE; 


I = SHR(OFFH,OFFH); . 
; STATEMENT # 32 


030С BOFF МОМ AL,OFFH 
03DE BIFF MOV CL,OFFH 
ОЗБО D253 SHR AL, CL 
ОЗЕ2 А26800 MOV I,AL 
END; 
; STATEMENT й 33 
0385 5D | РОР ВР 


0356 63 НЕТ 


РО/М-36 COMPILER SDK86 SERIAL MONTTOR 


84 


85 
86 


87 


89 


90 


91 


92 


SI08251SETTLINGDELAY ENDP 


/R88859898838888838.8288. ааа ваа ава ааа 


ы UTILITY ROUTINES SECTION s 
ооо со оно ваа ава на ва ваа ава / 


1 SIO$VALID$HEX: 


; STATEMENT # 84 
/% THIS ROUTINE TESTS IF THE INPUT PARM IS А VALID ASCII HEX DIGIT 
AND RETURNS TRUE AS THE VALUE OF THE PROCEDURE IF SO AND FALSE 


IF NOT. #/ 
STOVALIDHEX PROC NEAR 
ОЗЕТ 55 PUSH BP 
03Е8 8BEC MOV BP,SP 


PROCEDURE (H) BYTE; 


2 DECLARE H BYTE; 
2 DO 120 TO LAST( ASCII); 
; STATEMENT 
ОЗБА  С506680000 MOV 1,0Н 
8129: 
ОЗЕР 803Е68000Ғ СМР І,ОРН 
ОЗЕ 771A ЗА 8130 
3 IF Н-А5СТІ(І) THEN RETURN TRUE; 
; STATEMENT 
03Е6 8A4604 MOV AL,(BP].H 
0329 8A1E6800 MOV BL, I 
03FD 8700 MOV ЗН, ОН 
ОЗЕЕ  СЕЗАЦТЗЕ СМР AL.CS: АЗСТТГ BX] 
0403 7504 JNZ 89 
; STATEMENT 
0405 BOFF MOV AL,OFFH 
0407 ЕВОЭ JMP 93 
99: 
3 END; 
; STATEMENT 
9409 8006680001 ADD I, ти 
040Е 75рЕ JNZ 0129 
8130: 
2 RETURN FALSE; 
; STATEMENT 
0410 8000 MOV AL,OH 
23: 
0412 5р РОР ВР 
0413 620200 RET 2H 
2 END; 
. ; STATEMENT 
SIOVALIDHEX ENDP 
t SIO$HEX: 


86 


87 


88 


89 


30 


91 


; STATEMENT # 92 
/9 THIS ROUTINE CONVERTS THE INPUT PARM FROM ASCII TO ITS BINARY 


EQUIVALENT AND RETURNS IT AS THE VALUE OF THE PROCEDURE. 


IS MADE FOR INPUT VALIDITY. #/ 
STOHEX PROC NEAR 
0415 55 PUSH BP 
0417  ЗВЕС MOV BP,SP 


NO 


CHECK 


Р,/М-86 COMPILER 


SDK86 SERIAL MONITOR 


PROCEDURE(C) WORD; 


DOUBLE(C-390H); 
; STATEMENT # 34 
[BP].C,39H 
910 
“ STATEMENT 8 95 
AL, ВРЈ.С 
AL,30H 
өц 


3761; 

; STATEMENT # 95 
AL. (8216 
AL,37H 


; STATEMENT # 98 


ТР "СНАКА" IS A VALID FIRST 
NAME AND RETURNS TRUE AS THE VALUE OF THE PROCEDURE IF SO. 


PROC NEAR 
BP 
BP,SP 


; STATEMENT # 99 
Т, ОН 
9133 


I,2H 
8132 
I, ТАН 
8132 


ТЕ CHAR=REG(I) THEN RETURN TRUE; 


93 г DECLARE С BYTE; 

94 2 IF C<='9' THEN RETURN 
0419 39780439 CMP 
041D 7707 ЧА 
ОЦТЕ ВАЦБОЦ MOV 
0422 2030 508 
0424 2805 ЈМР 

910: 

96 2 ELSE RETURN DOUBLE(C- 
0426 8A4604 MOV 
0429 2037 SUB 

0%: 
0%2В ВЦОО MOV 
0420 50 РОР 
042Е С20200 RET 

97 2 ЕМО; 

5ТОНЕХ ЕМОР 
98 1 SIO$VALID$REG$FIRST: 
/% THIS ROUTINE CHECKS 
STOVALIDREGFIRST 
0431 55 PUSH 
0432 ВВЕС MOV 
PROCEDURE BYTE; 

99 2 DO [20 TO 26 BY 2; 
0434 С606680000 MOV 
0439 EBO7 JMP 

0131: 
0438 8006680002 ADD 
0440 7214 JB 
@133: 
0442 803Е68001А CMP 
0447 7713 JA 
100 3 
0449 406600 MOV 
ОЦЦС 8A1E6800 MOV 
0450 В790 MOV 
0452 2ЕЗАШ758 СМР 
0456 75ЕЗ JNZ 
9458 BOFF MOV 
045А 5D POP 
O45B C3 RET 
102 3 END; 
8132: 
103 2 RETURN FALSE; 
045С 8000 MOV 


; STATEMENT # 100 


АС, С3$ : ВЕС (ВХ ] 
8131 
; ФТАТЕМЕМТ # 101 
AL,OFFH 
BP 


; STATEMENT # 102 


; STATEMENT # 103 


АБ, ЭН 


24:35 


LETTER OF A REGISTER 





PL/M-86 COMPILER SDK36 SERIAL MONITOR PAGE 
O4SE 50 POP BP 
О45Р СЗ НЕТ 
104 2 ZND; 
: STATEMENT # 104 
STOVALIDREGFIRST ENDP 
195 1 SIOSVALID$REG: 
; STATEMENT # 105 
/* THIS ROUTINE CHECKS IF THE TWO INPUT PARMS TAKEN TOGETHER FORM 
A VALID REGISTER NAME. ТТ SEARCHES THE REGISTER TABLE AND IF А 
MATCH IS FOUND, THE GLOBAL 'REG$INDEX' IS SET TO THE INDEX OF THE 
VALID REGISTER AND THE PROCEDURE RETURNS TRUE. IF NO MATCH THE 
PROCEDURE RETURNS FALSE AND НЕСЗТНОЕХ IS UNDEFINED. %/ 
STOVALIDREG PROC NEAR 
0460 55 PUSH BP 
0461 ЗВЕС MOV BP,SP 
PROCEDURE (C1,C2) BYTE; 
106 2 DECLARE (C1,C2) BYTE; 
107 2 DO REG$INDEX=:0 TO 13; 
; STATEMENT # 107 
0463  с7062Е000000 MOV REGINDEX,0OH 
8134: 
0469 833E2E000D СМР REGINDEX,ODH 
046Е 7731 JA @135 
108 3 IF CisREG(REG$SINDEX®2) AND С2-НЕС( НЕСЗТНОЕХФ2 + 1) THEN 
; STATEMENT # 108 
0470 8В1Е2Е00 MOV ВХ, REGINDEX 
0474 01ЕЗ SUL BX, 1 
0476 8A4606 MOV ALC ВР]. 01 
0479 2E3A4758 CMP AL,CS:REG( ВХ) 
0470 BOFF MOV AL,OFFH 
ОЦ7Е 7401 JZ $+3H 
0481 чо INC AX 
0482 ВАЦЕОЧ МОУ CL,{BP].C 
0485 50 PUSH AX ‚1 
0480 2E3A4F59 СМР CL,CS:REG(BX+1H] 
ОЧЗА BOFF MOV AL,OFFH 
O48C 7401 JZ $+3H 
048Е Цо INC AX 
ОЧВЕ 59 POP СХ ; 1 
0490 22C1 AND АБЫ, СЫ 
0492 2008 RCR AL, 1 
0494 7304 JNB 813 
109 3 RETURN TRUE; 
; STATEMENT # 109 
0496 BOF F MOV AL,OFFH 
0498 2809 JMP 86 
813: 
110 3 ЕМО, 
; STATEMENT 8 110 
0494 83062E0001 ADD REGINDEX, 1H 
O49F 73C8 JNB 0134 
8135: 
114 2 RETURN FALSE; 
; STATEMENT # 111 
ОЗА1 8000 MOV АБ, ОН 
96: 


14 


PL/M-86 COMPILER 


115 


116 


117 


118 


119 


123 


124 


чл) № 


SDK86 SERIAL MONITOR 


O4A3 5D POP BP 
ОЦАЦ C20400 RET 4H 
END; 
; STATEMENT # 112 
SIOVALIDREG ENDP 
SIO$CRLF: 
; STATEMENT # 113 
/* THIS ROUTINE OUTPUTS А CR AND LF TO THE OUTPUT PORT. #/ 
SIOCRLF PROC NEAR | 
O4AT 55 PUSH BP 
O4A8 8BEC MOV BP,SP 
PROCEDURE; 
CALL SIO$OUT$CHAR(ASCR); 
; STATEMENT # 114 
ОЧАА BOOD MOV AL,ODH 
ОЧАС 50 PUSH AX ; 1 
O4AD E83FFE CALL 51000ТСНАН 


CALL SIO$OUT$CHAR(ASLF); 


; STATEMENT # 115 


0480 BOOA MOV AL,OAH 
O4B2 50 PUSH AX ‚л 
0483 E839FE CALL STOOUTCHAR 
END; 
: ; STATEMENT # 116 
0486 50 РОР ВР 
0487 СЗ RET 
STOCRLF ENDP 
SIO$TEST$WORD$MODE: 


; 
/9 THIS PROCEDURE TESTS FOR А "И" FOLLOWING THE COMMAND AND ТЕ 50 
SETS THE FLAG 'WORD$MODE TO TRUE OR FALSE OTHERWISE. 


STATEMENT # 117 


OPTIONAL BLANK FOLLOWING COMMAND. "/ 


SIOTESTWORDMODE 
0488 55 РЈ5Н 
0489 8BEC MOV 
PROCEDURE; 


WORD$MODE = FALSE; 


O4BB С606690000 MOV 
CALL STO$GET$CHAR; 
ОЧСО ES84CFE CALL 
IF CHAR='W' THEN 
04С3 803Е660057 СМР 
04С8 7508 JNZ 


DO; 
WORD$MODE = TRUE; 


PROC NEAR 
BP 
BP,SP 


; STATEMENT # 118 
НОКОМООЕ , ОН 


; STATEMENT # 119 
STOGETCHAR 


: STATEMENT # 120 
CHAR,57H 
814 


; STATEMENT # 122 
WORDMODE,OFFH 


: STATEMENT # 123 
SIOGETCHAR 


ОЧСА C6066900FF MOV 

CALL SIO$GETS$CHAR; 
ОЧСЕ E83DFE CALL 

END; 


314; 


SCANS OFF 


PAGE 


15 


PL/M=86 COMPILER 


126 


тет 


128 


131 


133 


134 
135 


м го 


0402 
0407 


0409 


O4DC 
O4DD 


O4DE 
O4DF 


O4E 1 


ОЦЕЦ 
04Е9 


ОЦЕВ 


ОЦЕЕ 
ОЦЕЕ 


ОЦЕО 
ОЦЕТ 


ОЦЕЗ 





SDK86 SERIAL МОМІТОВ PAGE 16 
IF CHAR=ASBL THEN 

; STATEMENT # 125 е 
803Е660020 СМР CHAR,20H 
7503 JNZ 815 

CALL ЗТОЗСЕТЗСНАН: 

; STATEMENT # 126 й 

E833FE CALL SIOGETCHAR 
815: 
END; 

; STATEMENT # 127 
5D POP BP 
СЗ RET | 

STOTESTWORDMODE ENDP \ 
STOSSCAN$BLANK: 
; STATEMENT # 128 
и? THIS ROUTINE IS CALLED AFTER A COMMAND LETTER ТО SCAN OFF THE 
OPTIONAL BLANK. */ 
STOSCANBLANK PROC NEAR 
55 PUSH BP 
8BEC MOV BP,SP 
PROCEDURE; 
CALL ЗТОЗСЕТЗСНАН; 

; STATEMENT # 129 

E82BFE CALL ЗІОСЕТСНАВ 
ТЕ CHAR=ASBL THEN .- 

; STATEMENT # 130 | h. 
803Е660020 СМР CHAR,20H <? 
7503 JNZ 816 ” 

CALL 510%С6ЕТ%СНАВ; 

; STATEMENT # 131 

E821FE CALL SIOGETCHAR 
016: 
ЕНО; 

; STATEMENT # 132 
50 РОР ВР 
СЗ RET 

SIOSCANBLANK ENDP 
92990 0 оо оо нав оо ооо ооо воа ва ва ва ва ваа аа 
,. ARGUMENT EXPRESSION EVALUATOR SECTION % 
ооо ооо аа аа оа вола аа аа ааа ав ааа ааа аа аа ва / 
SIO$GET$WORD: 
; STATEMENT # 133 
/% THIS ROUTINE READS CHARS FROM THE INPUT PORT AND EVALUATES 
AN EXPRESSION CONSISTING OF '+-' AND OPERANDS OF HEX NUMBERS ы 
AND REGISTER NAMES. %/ 
SIOGETWORD PROC NEAR 
55 РОЗН ВР 
8BEC MOV BP,SP 
PROCEDURE WORD; 
DECLARE (SAVE,W) WORD, (OPER,T) BYTE; 
OPER = "+"; 

; STATEMENT # 135 

с606680028 MOV OPER, 2ВЕ 


PL/M-86 COMPILER 


SDK86 SERIAL MONITOR 


136 2 
ОЦЕВ 
137 2 
138 3 
O4FE 
0501 
139 3 
0504 
140 3 
0504 
0500 
050Е 
141 3 
142 4 
0511 
143 4 
0514 
0518 
051C 
051Е 
0521 
144 ц 
145 5 
0523 
0527 
0529 
052С 
146 5 
052Р 
147 5 
0532 
0537 
0539 
053С 
0540 
148 5 
149 4 
0542 
0546 
0549 


150 


Ч з 0; 
: STATEMENT 
C7064E000000 MOV м, ОН 
DO WHILE TRUE; 
: STATEMENT 
8136: 
Т = СНАВ; 
; STATEMENT 
406600 MOV AL,CHAR 
А26СОО MOV T,AL 
SAVE = 0; | 
; ЗТАТЕМЕНТ 
C7064C000000 MOV SAVE, ОН 
IF SIO$VALID$REG$FIRST THEN 
; STATEMENT 
ЕВ2ЦЕЕ CALL SIOVALIDREGFIRST 
0008 RCR AL,1 
733B JNB 017 
DO; 
CALL SIO$GETS$CHAR; 
; STATEMENT 
ЕВЕВЕО CALL SIOGETCHAR 
ТЕ SIO$VALID$REG(T,CHAR) THEN 
: STATEMENT 
FF366C00 PUSH Т : 1 
ЕЕЗ66600 РОЗН СНАВ : 2 
ЕВЧТЕР CALL SIOVALIDREG 
2008 RCR AL, 1 
731F JNB 818 
DO; 
SAVE = REG$SAV(REG$INDEX); 
; STATEMENT 
8B1E2E00 MOV BX, REGINDEX 
D1E3 SHL BX, 1 
8B4730 MOV АХ, НЕСЗАУГ BX] 
АЗЦСОО MOV SAVE, АХ 
CALL SIO$GET$CHAR; 
; STATEMENT 
E8DDFD CALL SIOGETCHAR 
GOTO EVAL; 
; STATEMENT 
07: 
803E6B002B CMP OPER, 2ВН 
7548 JNZ EVAL 
A14C00 MOV AX,SAVE 
01064E00 ADD М, АХ 
EB46 JMP @22 
END; 
; STATEMENT 
018: 
ELSE 
SAVE = SIO$HEX(T); 
; STATEMENT 
FF 366C00 PUSH Т ; 1 
E8CDFE CALL SIOHEX 
A34C00 MOV SAVE, АХ 
END; 


136 


127 


139 


140 


146 


147 


148 


149 


РЬ/М-86 COMPILER 


SDK86 SERIAL MONITOR 


#17: 
151 3 ТЕ NOT(SIO$VALID$HEX(T)) THEN GOTO ERROR; 
; STATEMENT # 151 
054С FF366C00 PUSH т ° 4 
0550 ES894FE CALL SIOVALIDHEX 
0553 2600 NOT AL 
0555 2008 RCR AL, 1 
0557 7303 JNB $+5H 
0559 ЕЭААЕС ЈМР ERROR 
153 3 DO WHILE SIO$VALID$HEX(CHAR); 
; STATEMENT # 153 
0138: 
055С FF366600 РОЗН CHAR » 4 
0560 ES884FE CALL SIOVALIDHEX 
0563 0008 АСА AL, 1 
0565 73CB JNB 87 
154 4 SAVE з SHL( SAVE, Ц) + SIO$HEX(CHAR); 
: STATEMENT # 154 
0567 A14C00 MOV АХ, SAVE 
056A B104 MOV CL, ЗН 
056C  ОЗЕО SHL АХ, CL 
0568 50 PUSH AX ; 1 
0567 FF366600 PUSH CHAR $ 
0573  ЕЗАОРЕ CALL ЗІОНЕХ 
0576 59 РОР СХ 5-3 
0577 03С1 ADD AX,CX 
0579 АЗ%С00 MOV SAVE,AX 
155 4 CALL SIO$GETSCHAR; 
; STATEMENT # 155 
057С E890FD CALL ЗТОСЕТСНАЯ 
156 4 END; 
; STATEMENT # 156 
057Р EBDB JMP 8138 
157 3 EVAL: ТЕ OPER='+’ THEN 
; STATEMENT # 157 
EVAL: 
158 3 Ч = W + SAVE; 
ELSE 
159 3 W = Я - SAVE; 
; STATEMENT # 159 
0581 А1%С00 MOV AX,SAVE 
0584 29064E00 SUB М, АХ 
822: 
160 3 ТЕ CHAR=sASCR OR CHAR=':° ОД СНАА-"," THEN 
; STATEMENT # 160 
0588 406600 MOV AL,CHAR 
0588 3С00 CMP AL,ODH 
0580 BOFF MOV AL,OFFH 
058Е 7401 42 $+3H 
0591 40 INC AX 
0592 50 РЈ5Н АХ ; 1 
0593 803E66003A CMP CHAR, ЗАН 
0598 BOFF MOV AL,OFFH 
059A 7401 JZ $+3H 
059 С 10 INC AX 
0590 59 РОР CX ; 1 
0592 ОАС1 OR AL, СТ, 


PAGE 


18 





PL/M-36 COMPILER SDK86 SERTAL MONITOR РАЈЕ 
0540 5) PUSH АХ . 1 
0541 8)3Е66002С СМР СНАВ,2СН 
05А6 ВЈЕРЕ MOV AL,OFFH 
0548 7401 JZ $+3H 
OSAA 4) INC AX 
ОБАВ 5) РОР Cx . 1 
05АС OAC1 ОВ AL,CL 
OSAE 0205 RCR AL, 1 
0580 7305 JNB 823 
151 3 RETURN Ч, 
; STATEMENT # 161 
05B2 A14500 MOV АХ, И 
0585 50 РОР ВР 
0586 C3 RET 
823: 
162 3 ТЕ СНАЕ2'+' OR СНАВ-" -" THEN 
; STATEMENT # 162 
0587 823566002Вв СМР СНАВ,2ВН 
05ВС ВОЕГг МОУ AL,OFFH 
OSBE 7401 JZ $+3H 
05С0 4) INC АХ 
05С1 59 PUSH AX 5-3 
0502 8933:660020 САР CHAR, 2рн 
05С7 ВОЕЕ MOV AL,OFFH 
05С9 7401 92 $+3Н 
05СВ 40 ІМС АХ 
05СС 53 РОР CX ; 1 
05СО OAC! ОВ АС, CL 
ОБСЕ рора АСВ АС, 1 
0501 7203 УВ $+5Н 
0503 Е930ЕС ЈМР ERROR 
163 3 OPER = CHAR; 
; STATEMENT й 153 
05D6 AQ6600 MOV AL,CHAR 
0509 126800 MOV OPER, AL 
ELSE 
164 3 GOTO ERROR; 
165 3 CALL SIO$GETS$CHAR; 
; STATEMENT # 165 
05DC ЕЗЗОЕО CALL SIOGETCHAR 
166 3 END; 
; STATEMENT # 166 
ОБОЕ ЕОТСЕЕ ЈМР 9136 
8137: 
167 2 END; 
; STATEMENT # 167 
05Е2 50 РОР ВР 
0523 СЗ ВЕТ 
STOGETWORD ENDP 
168 1 SIO$GET$ADDR: 
: STATEMENT # 158 
из THIS ROUTINE ACCEPTS A VALID ADDRESS EXPRESSION CONSISTING 
OF AN OPTIONAL 4560»: AND AN DISPLACEMENT, %/ 
STOGETADDR PROC NEAR 
05ЕШ 55 PUSH BP 
0555 ВВЕС МОУ ВР, ЗР 


19 


199 


170 


172 


174 


175 


го 


го 


го 


0567 
ОБЕА 
05Ер 


09521 
255 
05F7 


05ҒА 
05FF 


0601 


0604 
0607 
O60A 


05ЈЕ 
0511 
1614 


9617 
9515 
1915 


0621 
9622 


9625 
2025 


9628 


50535 SERTAL МОХІТОЯ 


PRICESOURE( PTR, DEFAULTS$SSASE); 


DECLARE PTR POINTER, 


DEC AULTS$BASE WORD, 


ARS BASED PTR STRUCTURE (OFF WORD, SEG WORD); 


ARG.SEG = 


8B4604 MOV 


045206 Les 
26894792 MOV 


DECAULTSBASE; 


: STATEMENT 
АХ, Вр]. DEFAULTBASE 
ВХ, 5P].PTR 
$3: АЯСГВХ+2Н],АХ 


ARI з 214344 анти; 


; STATEMEUT 


32025 CALL STIGTTWORD 
(45:06 „Ба BX," 3P].PTR 
268327 MOV 8Е5:42278Х1|,АХ 
ТЕ CHAR=':' THEN 
‚ : STATEMENT 
301556333А СМР CHAR, ЗАЗ 
7529 JNZ 325 
92; 
CALL SID2šGET$CHAR; 
; STATEMENT 
ESOBFD CALL STOGETCHAR 
ARG.SES з АЙйЙО.О7У; 
; STATEMENT 
04535936 455 ВХ, ВР).РТА 
258807 MOV AX, ES: ARG( BX) 
20894702 MOV SS:ARG( ВХ+2Н] ‚АХ 
ARG.OFF = ЭГОЗСЕТЗ МОВО; 
; STATEMENT 
ЕЗОЕЕЕ CALL STOGETWORD 
01455326 Les ВХ, ВР1|.РТЯ 
268907 MOV ES: АНСГВХ |, АХ 
ТЕ СНАН-!:" THEN СОТО ERROR; 
; STATEMENT 
823%#5°203A СМ? CHAR, ЗАЧ 
7523 JNZ $+5Н 
ЕЗЕ5ЕВ Јмр ERROR 
; STATEMENT 
END; 
326: 
END; 
; STATEMENT 
50 РО? ЗР 
020600 RET 5H 
STOGETADDR ЕЧОР 


STISUPOATESTP: 


/9 THIS PROCEDURE 15 CALLED ЗУ SINGLE 


; STATEMENT 
51252 


ІР AND INSTRUCTION 3175 AND JPEN THE ЇР 


STIUPDATETP 
59 PUSH 
ЗВЕС MOV 


PROCEDURE; 
САС. STISOUTSILANS ; 


ES4CFD CALL 


PROC NEAR 


BP 
Sf, SP 

$ STATEMENT 
STOOUTBLANX 


CALL STOSOUTSWORD( TP); 


# 179 


9 171 


# 172 


8 175 


2 178 


2 139 


2 131 
AND. SO T2 OUTPUT THE 
FOR INPUT., %/ 


"ЧЛ Ret 


20 


PL/M=86 COMPILER SDK86 SERIAL MONITOR 
; STATEMENT й 183 
0628 FF364800 PUSH REGSAV+18H; 1 
O62F E82EFD CALL SILOOUTWORD 
184 2 CSIP.SEG = CS; 
; STATEMENT # 184 
0632 A14000 MOV AX, REGSAV+10H 
0635 А32800 MOV CSIP+2H,AX 
185 2 CSIP.OFF = IP; 
“ STATEMENT # 185 
0638 А14800 MOV AX, REGSAV+18H 
0638 А32600 MOV CSIP, АХ 
186 2 CALL SIO$OUT$CHAR('-'); 
> STATEMENT # 186. 
063E 8020 MOV AL,2DH 
0640 50 PUSH AX 4:24 
0641 ЕЗАВЕС CALL 51000ТСНАВ 
187 2 CALL SIO$OUT$BLANK; 
; STATEMENT % 187 
0644 E830FD CALL SIOOUTBLANK 
183 2 CALL SLO$OUTS$BYTE(MEMORY$CSIP); 
; STATEMENT # 188 
0647 C41E2600 LES ВХ, МЕМОВУСЗТРРТЯ 
0648 26FF37 PUSH ES:MEMORYCSIP([ BX] 
0648 E8DFFC CALL 51000ТВҮТЕ 
189 2 CALL SIO$OUT$BLANK; 
; STATEMENT # 189 
0651 £€823FD CALL SIOOUTBLANK 
199 2 CALL SIO$GET$CHAR; 
; STATEMENT # 190 
0654 E8B8FC CALL SIOGETCHAR 
191 2 IF CHAR<>',' AND CHAR<>ASCR THEN CALL SIO$GET$ADDR(@CSIP,CS); 
; STATEMENT # 191 
0657 803Е66002С CMP CHAR, 2CH 
065С BOFF MOV AL,OFFH 
065Е 7501 JNZ $+3H 
0660 40 INC AX 
0661 50 PUSH AX ; 1 
0662 803E66000D СМР СНАВ, Орн 
0667 ВОЕҒ MOV AL,OFFH 
0669 7501 JNZ $+3H 
0668 10 ІМС АХ 
066C 59 РОР CX 5-1 
066D 22С1 AND ALCL 
066Е 0008 RCR AL,1 
0671 7300 JNB 028 
; STATEMENT # 192 
0673 80062600 СЕА АХ, СЗТР 
0677 1E РИЗН 05 ; 1 
0678 50 PUSH АХ : 2 
0679 FF364000 PUSH REGSAV+10H; 3 
0670 ES864FF CALL SIOGETADDR 
828 
193 2 END; 
; STATEMENT # 193 
0680 5D POP BP 
0681 C3 RET 


ЗТОПРОАТЕТР ENDP 


сл 


2 


PL/M-36 COMPILER 50К86 SšRIAL МОЧА ТОН РАП 


194 


195 
196 


197 


198 


199 


200 


201 


202 


203 


294 
295 


гә ғә 


17 
гэ 
го 


1%18 0 0002 20 0 00022002 21202 00020 0200282 5 


9 РАРЕН ТАРЕ READ SECTION ы 
посовзсосечосовозеваовазе февзее / 


STOSREADSCHAR: 
; STATEMENT š 194 
/9 THIS PROCEDURE READS А BYTE FROM TUS PAPER TAPE READER ЈЕ THE TTY 
BY ACTIVATING ОТА, SAMPLING OSR FOR THE START BIT, DEACTIVATING 
DTR WHEN THE START BIT APPEARS, AND READING THE DATUM FROM TYE 
USART. TO PROVIDE А HOLD-OFF CAPASILITY FOR THE LOAD COMMAN:: 
ONLY (NOT INTENDED POR TTY PAPER TAPS) CONTROL-S WILL CAUSE 7415 
ROUTINE TO WAIT FOR A CORRESPONDING CONTROL-Q ТО BE READ 82231: 
CONTINUING. ?/ 


STOREADCHAR PROC NEAR 
0682 55 PUSH ЗР 
0683 ЗВЕС MOV BP,SP 


PROCEDURE BYTE; 
DECLARE DELAY WORD; 


LOOP: 
; STATEMENT # 135 
LOOP: 
00ТРОТ(51045ТАТУРОНТ) з 510332513078302М, /% OTR ON */ 
0685 BAF2FF мо“ ОХ,ОРРЕО2Н 
0688 8027 MOV AL, 27d 
068А EE OUT DX 
DELAY з 0; 
> STATEMENT 6 127 
2688 6572852020090 ADV DELAY,OH 
DO WHILE (INPUT(STI$STATSPORT) AND 51030580Ү1):2, /®МАТТ STAR ТРИ 
; STATEMENT 9 198 
9142: 
0691  ЗАЕФ2ЕЕ MOV ОХ, ОЕЕЕЗЧ 
0694 25 IN гр 
9695 А880 TEST AL, ЗОЯ 
0697 7517 JNZ 9141 
DELAY = DELAY + 1; 
; STATEMENT 9 199 
0699 415200 MOV АХ, DELAY 
969C 33С001 ADD АХ, 1Н 
069? 42035220 NOV DELAY,AX 
ТЕ DELAY>S4AXZDSLAY THEN 
° ; STATEMENT 2 209 
0642 301027 СМР АХ, 27104 
2645 7254 JB 149 
24% 
ОФТРУТ(ЗІО9ЗТАТФРОЯТ) = 512532515СМ80; га ЭТЭ ЦЕР ез 
“ STATEMENT # 202 
06А7 ЗАЕ2ЕҒ MOV OX,OFFF2H 
06АА 8025 моч AL, 258 
ОБАС 5% ау“ n X 
2072 18108; 
. STATESMEN g 2393 
9540 535552 J: P САВО 


Баш 


PL/M-36 COMPILER 


296 


207 


212 


213 


214 


217 


го 


50530 SERIAL MONTTOR 


9141: | 
OUTPUT(SIOSSTATS$PORT) = 


. 
, 


SI0$8251$CMND; 


STATEMENT # 205 


STATEMENT # 206 


/% OTR OFF #7 


/% WAIT LOOP #/ 


a / 


0680 BAF2FF MOV DX,OFFF2H 
0683 8025 МОУ AL,25H 
06B5 ЕЕ OUT DX 
DO WHILE (INPUT(SIO$STAT$PORT) AND SIO$RXRDY)=9;END; 
; STATEMENT # 207 
9142; 
9686 ВАЕОЕЕ MOV DX,OFFF2H 
0689 EC IN DX 
ОбВА A392 TEST AL,2H 
06ВС 74F8 JZ 81142 
CALL STO$CHECKSCONTROLSCHAR; 
; STATEMENT # 299 
ОбВЕ ЕЗЕ2ЕВ CALL STOCHECKCONTROLCHAR 
ТЕ CHAR = 11H THEN GOTO LOOP; /% GET ANOTHER ТЕ CTL=Q %/ 
; STATEMENT 48 210 
06C1 803Е660011 СМР CHAR,11H 
06с5 74BD JZ LOOP 
RETURN CHAR; 
; STATEMENT # 212 
06С8 106500 MOV AL,CHAR 
обсв 5D POP ВР 
0600 c RET 
END; 
; STATEMENT # 213 
ЗТОРЕЛОСВАЗ ENDP 
SLOSREACSEYTL: 
; STATEMENT # 214 
/а THIS ROUTINE READS A BYTES FROM THE PAPER TAPE READER. 
ЗТОКЕАОВТТ 5 PROC МСАК 
06CD 55 РОЗН ВР 
ОбСЕ РВЕС MOV ВР,5Р 
PROCEDURE BYTE; 
DECLARE T BYTE; 
T = LOW(STO$HEX(SIO$READ$CHAR) ); 
; STATEMENT # 215 
0600 ЕЗАЁЕЕ CALL STOREADCHAR 
0603 50 PUSH AX ы 1) 
0604 E83FFD CALL ЗІОНЕХ 
0607 A26D00 MOV TAL 
T = SHL(T,4) + LOW(STO$HEX(STO$READSCHAR! ): 
| > STATEMENT # 417 
06DA A96D90 MOV AL,T 
0600 B194 MOV CL,4H 
O6DF р2Е0 SHL AL, CL 
06Е1 59 PUSH AX 81 
06Е2 28902: CALL STOREADCHAR 
05885 59 Риза АХ а. 2 
0526 23202 САҚЫ 9 ТОНЕХ 
09623 53 РЭР CX 
ОБЕА 023: ADD Ab ‚СА 
05:50 526992 МОМ То, ТЕ 
СВЕ = CHECKSSUN > 





PL/M-86 COMPILER SDK36 SERIAL MONITOR PAGE 


; STATEMENT # 218 


06ЕР A06D00 MOV AL,T 
06F2 00066700 ADD CHECKSUM, AL 
219 2 RETURN T; 
; STATEMENT # 219 
0626 5D POP BP 
06Е7 СЗ RET 
220 2 END; 
; STATEMENT # 220 
STOREADBYTE ENDP 


221 1 SIO$READšWORD: 
; STATEMENT # 221 
/® THIS ROUTINE READS A WORD FROM THE PAPER TAPE READER AND RETURNS IT 
AS THE VALUE OF THE PROCEDURE. 9/ 


STOREADWORD PROC NEAR 
0628 55 РЈ5Н ВР 
ОбЕ9 8ВЕС MOV BP ,SP 


PROCEDURE WORD; 


222 2 DECLARE T BYTE; 
223 2 T = SIO$READ$BYTE; 
; STATEMENT # 223 
ОбЕВ E8CFFF CALL STOREADBYTe 
06ҒЕ A26E00 MOV T,AL 
224 2 RETURN SHL(DOUBLE(T),8) + DOUBLE(SIO$READSBYTE) ; 
; STATEMENT # 224 
0701 А06Е00 MOV AL,T 
0704 8400 MOV AH, ОН 
0706 8108 MOV CL, 8H 
0708 D3£E0 SHL AX,CL 
079A 50 PUSH AX . 1 
0708 ЕЗВЕРЕ CALL SIOREADBYTE 
ОТОБ 8400 MOV АН,ОН 
0710 59 РОР CX 23 
9711 0361 ADD АХ, СХ 
0713 5D POP BP 
0714 СЗ RET 
225 2 END; 
; STATEMENT # 225 
STOREADWORD ENDP 
/ 9992 ваа ааа аа аа 9 аа аа аа ваа а ааа 98988 а 998988 
Ч INTERRUPT AND RESTORE/EXECUTE SECTION Ы 
9900009 аа воо еее оа ааа ааа а 88 898 888 88 88 888 888809 / 
226 1 SAVESREGISTERS: 
; STATEMENT # 226 
/% THIS ROUTINE IS USED ТО SAVE THE STACKED USER'S REGISTERS IN THE 
MONITOR’S SAVE AREA. %/ 
SAVEREGISTERS PROC NEAR 
42715. 55 PUSH BP 
0716 8BEC MOV BP,SP 
PROCEDURE; 
ent 2 ВР = MEMORYS$SUSERSTACK; 


; STATEMENT: # 227 
0718 CH1Z2A00 LES ВХ,МЕМОНҮОЗЕНЗТАСКРТН 


PL/M-85 COHPILGA 


239 


231 


232 


233 


~ 
ма) 
чл 


2 36 


237? 


f.) 


971C 
071F 


0722 


9759 
0757 


30К85 SERTAL МОМТТОВ РАЈЕ 
263807 мом АХ,Е5:МЕМОВХУЗСАЗТАСК"ВХ) 
A33A00 MOV REGSAV+0OAH, АХ 
ОЗБЯЗТАСК. ОУ: = USERSTACK.OFF + Ц; 
; STATEMENT # 228 
83062A0094 А21; USERSTACK, 4H 
03 Тед TO 12; /% POP REGISTERS OFF OF STACK #/ 
> STATEMENT # 229 
C605630090 «У Т, ОН 
91%. 
803658000 АР Т, ОАН 
7725 ЈА 3145 
АЕ235А4(8Е05080(1)) = MEMORY$USERSTACK; 
; STATEMENT # 230 
84156390 MOV BL,I 
8700 MOV BH,OH 
ЗЕВАЗЕТЦОО MOV BL,CS:REGORDS BX] 
B700 MOV BH, OH 
ОТЕЗ SHL вх, 1 
C4462A00 LES SI,MEMORYUSERSTACKPTR 
258804 MOV АХ, ЕЗ : МЕМОВУИЗЕНСТАСКГ ЗІ) 
394730 MOV REGSAV(BX],AX 
USERSTACK.OFF = USERSTACK.OFF + 2; 
; STATEMENT # 231 
8306240092 .ADD USERSTACK,2H 
END; 
; STATEMENT # 232 
8905689001 ADD 1,1Н 
7504 | JNZ 9144 
9146: 
SS = USERSTACK.SES; 
; STATEMENT # 233 
A12C00 MOV АХ, USERSTACK+2H 
АЗЦЦОО MOV REGSAV414H, AX 
ЗР = USERSTACK.OFF; 
; STATEMENT # 234 
A12A00 MOV AX, USERSTACK 
A33800 MOV REGSAV+8H, АХ 
END; 
; STATEMENT 8 235 
5D POP ВР 
СЗ RET 
SAVEREGLISTERS ENDP 
ВЕЗТОПЕФЕХЕСИТЕ: 
; ЗТАТЄМЕЧТ # 236 
/а THIS PROCEDURE RESTORES THE STATE 27 THE 03345 МАТЧ1:2 AND 
PASSES CONTROL BACK TO THE USER PROGRAM. ТТ CONTAT:IS A 
MACHINE LANGUAGE SUBROUTINE ТО PERFORM THE РОРР: 1: OF THE 
USER REGISTERS AND ТО EXECUTE AN "18547" то TRANS EF? 733 
TO THE USER'S PROGRAM. */ 
RESTOREEXECUTE PROC мал? 
55 PUSH ЗР 
3REC MOY up ЗР 
PROZEDURE: 
DECLARE НЕЗТОРЕЗЕХХСЮТЯЗСОЮІ(Я» BYTS JATA 
(933H,9ECH, /% МОУ ВР,5Р 
э384,945Н,2024, /% MOV АХ, “ВО, PAR“? +, 


РЬ/М-86 COMPILER 


233 


2 39 


240 


241 


242 


243 


245 


245 


246 


0769 
0766 


076Е 
0772 


0775 


0774 
ОТТЕ 


0781 


0786 
О788 
078С 
078Е 
0793 
0795 
0797 
0794 
ОТ9Е 


07А1 
0746 


ОТАВ 


O7AD 
0780 
0784 





SDK36 SERIAL MONITOR 
08ВН,05ЕН,004Н, /% MOV BX,/BP/.PARM1 a/ 
O8EH,ODOH, /а MOV SS,AX 8 / 
08ВН,0ЕЗН, /9 МОМ 5Р,ВХ 8 / 
050Н, /% РОР ВР “/ 
OSFH, /% РОР DI ./ 
OSEH, /% РОР SI е / 
058Н, /% РОР ВХ 8/ 
О5АН, /а РОР DX 8 / 
059Н, /% РОР СХ ./ 
058Н, /% РОР АХ а / 
ОТЕН, /% РОР 05 е / 
007Н, /8 РОР 55 8 / 
ОСЕН), /8 IRET 8 / 
RESTORESEXECUTE$CODESPTR WORD DATA ( «ВЕЗТОВЕФЕХЕСОТЕЗСОРЕ); 
USERSTACK.SEG = SS; 
; STATEMENT 8 238 
A14400 MOV AX, НЕСЗАУ + 1 ЦН 
A32C00 MOV USERSTACK+2H, АХ 
USERSTACK.OFF = SP; 
; STATEMENT # 239 
A13800 MOV AX, REGSAV+8H 
A32A00 MOV USERSTACK, AX 
ро 120 то 10; /® PUSH USER'S REGISTERS ONTO HIS STACK */ 
; STATEMENT # 240 
C606680000 MOV I, ОН 
9146: 
803Е68000Ү СМР Т, ОАН 
1737 ЈА 8147 
USERSTACK.OFF = ОЗЕВЗТАСК.ОРЕ - 2; 
; STATEMENT # 241 
832Е240002 SUB USERSTACK, 2H 
MEMORY$USERSTACK = REGS$SAV(REG$ORD(10-1)); 
; STATEMENT # 242 
ВЗОА MOV BL,OAH 
24185820 508 BL, I 
8700 MOV BH,OH 
2E8A9F7400 MOV BL,CS:REGORD( ВХ) 
8709 MOV Вн, ОН 
01Е3 SHL BX, 1 
8B4730 MOV AX, REGSAV( ВХ) 
СЦ 1Е2АОО LES ВХ, MEMORYUSERSTACKPTR 
268907 MOV ES:MEMORYUSERSTACK[ ВХ), АХ 
END; 
; STATEMENT # 243 
8006680001 ADD I,1H 
75D2 JNZ 8146 
8147: 
USERSTACK.OFF = USERSTACK.OFF - 2; 
; ЗТАТЕМЕМТ # 245 
832Е240002 SUB USERSTACK,2H 
MEMORY$USERSTACK = BP; 
; STATEMENT # 245 
A13A00 MOV АХ, REGSAV+0AH 
C4¥1E2A00 LES BX,MEMORYUSERSTACKPTR 
268907 MOV £S:MEMORYUSERSTACK(BX],AX 


CALL RESTORESEXECUTE$SCODE$PTR(USERSTACK.OFF,USERSTACK.SEG); 


(г, 


Р,/ч-34 


287 


249 


де. 


251 


252 


253 


~ 


го 


COMPILER 


0787 
27BB 
ОТВЕ 


ОТ СЦ 
37065 


SDK85 SERIAL MONITOR PAGE 


; STATEMENT # 246 


FF362A00 PUSH USERSTACK; 1 
ҒЕЗ62С00 PUSH USERSTACK+2H; 2 
2EFF 160400 CALL CS:RESTOREEXECUTECODEPTR 
END; 
; STATEMENT # 247 
50 РОР ВР 
СЗ RET 
RESTOREEXECUTE ENDP 


INTERRUPTI$ENTRY: 


07C6 
9797 
07С8 
07С0 
07СЕ 
07СЕ 
0700 
0701 
0702 
0703 
0706 
0707 
0708 
0709 
ОТОА 
0708 
07DC 
07DD 
97рЕ 


O7DF 
ОТЕО 


07Е2 
ОТЕЦ 


ОТЕ? 


07Е9 , 


ОТЕС 
ОТЕЕ 


07Е1 
ОТЕЦ 


07Е6 


; ФТАТЕМЕМТ # 248 
/8 THIS PROCEDURE IS CALLED WHEN THE СРО IS INTERRUPTED BY EXECUTING 
AN INSTRUCTION WITH THE TRAP BIT SET (SINGLE STEP). #/ 


06 PUSH ES 
ТЕ PUSH DS 
2E8E1EA600 MOV DS,CS: @@DATA$FRAME 
50 PUSH AX 
21 PUSH СХ 
52 PUSH DX 
53 PUSH BX 
56 PUSH SI 
27 PUSH DI 
Е80900 CALL INTERRUPTIENTRY 
ЈЕ РОР DI 
5Е РОР 51 
58 РОР BX 
БА РОР ОХ 
59 РОР CX 
58 POP AX 
ЇЕ РОР 05 
07 POP ES 
СЕ IRET 
INTERRUPTIENTRY PROC NEAR 
99 PUSH BP 
ВВЕС MOV BP,SP 


PROCEDURE INTERRUPT 1; 
USERSTACK.OFF = STACKPTR; /% CHANGE ТО MONITOR'S STACK ®/ 

; STATEMENT # 249 

89E0 MOV AX,SP 

A32A00 MOV USERSTACK, AX 


USERSTACK.SEG = STACKBASE; 


; STATEMENT # 250 


ВСОО MOV AX,SS 
A32C00 MOV USERSTACK+2H,AX 
STACKPTR = MONITOR$STACKPTR; 
; STATEMENT # 251 
A11400 MOV AX,MONITORSTACK2TR 
89C4 MOV 5Р, АХ 


ЗТАСКВАЗЕ = MONITOR$STACKBASE; 
; STATEMENT # 252 
A11600 MOV AX,MONITORSTACKBASE 
8EDO MOV SS,AX 
CALL SAVE$REGISTERS; 
; STATEMENT # 253 
ЕВ1СЕЕ CALL SAVEREGISTERS 


Р,/М-86 COMPILER 


255 


256 


257 


258 


259 


260 
261 


262 


263 


264 


265 
266 


268 


269 


270 


w ГӘ 


O7F9 


O7FF 
0804 


0806 


0809 


080c 


080F 
0814 


0816 
0819 


0810 
081Е 


0822 


0828 


0828 


0830 
0832 


0835 


0838 
0839 


FL = FL AND (МОТ STEP$TRAP); 


SDK86 SERIAL MONITOR 


/% CLEAR STEP FLAG 9/ 


; STATEMENT # 254 


/% CONTINUE ТЕ NOT 55 %/ 


# 256 


# 257 


# 258 


# 259 


# 261 


" 262 


ЗТЕР FLAG #/ 
# 263 


# 264 


# 268 


# 270 


"INT 3" 


PAGE 


INSTRUCTION. 
ALSO AN EXTERNAL 


INTERRUPT OR A USER SOFTWARE INTERRUPT MAY CAUSE THIS PROCEDURE ТО BE 


81264 A00FFFE AND ВЕСЗАУ+ ТАН , OFEFSFH 
ТЕ LAST$COMMAND<>SS$COMMAND THEN 
; STATEMENT # 255 
803£6A0003 CMP LASTCOMMAND, 3H 
7403 JZ 831 
CALL RESTORESEXECUTE; 
; STATEMENT 
ESSDFF CALL RESTOREEXECUTE 
831: 
CALL SIO$CRLF; 
; STATEMENT 
ЕВУВЕС CALL SIOCRLF 
CALL SIOSUPDATESIP; 
; STATEMENT 
E815FE CALL SIQUPDATEIP 
IF CHAR=',' THEN 
; STATEMENT 
803£66002C CMP CHAR, 2CH 
7515 JNZ 832 
00; 
IP = CSIP.OFF; 
; STATEMENT 
A12600 MOV AX,CSIP 
A34800 MOV REGSAV+18H, AX 
CS = CSIP.SEG; 
; STATEMENT 
A12800 MOV AX,CSIP+2H 
A34000 MOV REGSAV+10H,AX 
FL = FL OR ЗТЕРЗТВАР; /% SET 
; STATEMENT 
810ЕЗА000001 OR REGSAV+1AH, 1008 
CALL RESTORESEXECUTE; 
; STATEMENT 
ЕЗЗВЕЕ CALL RESTOREEXECUTE 
END; 
832: 
ТЕ CHAR<>ASCR THEN GOTO ERROR; 
; STATEMENT 
803Е660000 СМР CHAR,ODH 
7403 JZ $+5H 
Е901Ғ9 ЈМР ERROR 
СОТО МЕХТЗСОММАМО; 
; STATEMENT 
Е937Е9 ЈМР NEXTCOMMAND 
END; 
INTERRUPTIENTRY ENDP 
INTERRUPT3$ENTRY: 
; STATEMENT 
/9 THIS PROCEDURE IS CALLED WHEN THE CPU EXECUTES A 
THE MONITOR INSERTS THIS (ОССН) FOR A BREAKPOINT. 
CALLED. %/ 
06 | РОЗН Е 5 
1E PUSH DS 


28 





PL/M-86 COMPILER 


271 


212 


273 


274 


215 


276 


211 


278 


219 


ОВЗА 
ОВЗЕ 
0840 
0841 
0842 
0843 
9844 
0845 
0848 
0849 
ОВЧА 
0848 
O84C 
0840 
O84E 
O84F 
0850 


0851 
0852 


0854 
0856 


0859 
0858 


085Е 
0861 


0863 
0866 


0868 


0868 


086Е 


SDK86 SERIAL MONITOR PAGE 
2E8E1EA609 MOV DS,CS: @@DATA$FRAME 
50 PUSH AX 
51 PUSH CX 
52 PUSH DX 
53 PUSH BX 
56 PUSH SI 
57 PUSH DI 
E80900 CALL INTERRUPT3ENTRY 
5F POP DI 
5Е РОР SI 
5B POP BX 
БА РОР DX 
59 POP CX 
58 POP AX 
1F POP DS 
07 POP ES 
СЕ IRET 
INTERRUPT3ZENTRY PROC NEAR 
55 PUSH BP 
8ВЕС. MOV ВР,ЗР 
PROCEDURE INTERRUPT 3; 
USERSTACK.OFF = STACKPTR; 
; STATEMENT # 271 
89E0 MOV AX,SP 
A32A00 MOV USERSTACK, AX 
USERSTACK.SEG = STACKBASE; 
; STATEMENT # 272 
8С00 MOV AX,SS 
A32C00 MOV USERSTACK+2H,AX 
STACKPTR = MONITOR$STACKPTR; 
; STATEMENT # 273 
A11400 MOV AX,MONITORSTACKPTR 
89C4 MOV SP,AX 
STACKBASE = MONITOR$STACKBASE; 
; STATEMENT # 274 
A11600 MOV AX,MONITORSTACKBASE 
8EDO MOV SS,AX 
CALL SAVE$REGISTERS; 
: STATEMENT # 275 
ЕВААЕЕ CALL SAVEREGISTERS 
CALL 5103СВ15Р,: 
; STATEMENT # 276 
E839FC CALL SIOCRLF 
GOTO AFTER$INTERRUPT; 
; STATEMENT # 277 
Е9А7Е9 ЈМР AFTERINTERRUPT 
END; 
INTERRUPT3ZENTRY ENDP 
INIT$INT$VECTOR: 
; STATEMENT # 279 
/* THIS ROUTINE INITIALIZES АМ INTERRRUPT VECTOR AS FOLLOWS: THE OFFSET 


FROM THE ADDRESS OF 


NUMBER OF BYTES FOR THE INTERRUPT PLM PROLOGUE. 


*INT$ROUTINE’ 


CORRECTED BY THE APPROPRIATE 
THE SEGMENT FROM THE 


CURRENT CS REGISTER [5 DETERMINED BY A MACHINE LANGUAGE CODED 


SUBROUTINE. %/ 
INITINTVECTOR 


PROC NEAR 


29 


Р,/М-85 COMPILER 


280 


281 


282 


283 


0871 
0872 


0874 
0877 
0878 
087c 
0870 


0882 
0885 
0888 
0888 


088Е 
ОВВЕ 


29 
8ВЕС 


50К86 SERIAL MONITOR 


PUSH 
MOV 


BP 


BP,SP 
PROCEDURE( INT$VECTORS$PTR, INT$ROUTINESOFF 
DECLARE INT$VECTORS$PTR POINTER, 


SET); 
INT$ROUTINE$OFFSET WORD, 


РА 


VECTOR BASED ТМТЗУЕСТОВЗРТА STRUCTURE (OFF WORD, SEG WORD), 
"19Н", /% OFFSET FOR PROLOGUE ?/ 
INITSINTSVECTORS$CODE(*®) BYTE DATA 


CORRECTION LITERALLY 


(055Н, 
08ВН,ОЕСН, 
O8CH,OC8H, 
OC4H,OSEH,OO4H, 
026H,089H,007H, 
OSDH, 
0C2H,004H,000H), 


га 
/% 
/% 
/ № 
/% 
/% 
/% 


PUSH ВР в / 
MOV BP,SP е / 
MOV AX,CS 8 / 
LES ВХ,/ВР/.РАВМІ %/ 
MOV ES:W/BX/,AX “/ 
РОР ВР °/ 
RET 4 * / 


ІМІТФІЧТЗУЕСТОЯЗСОРЕЗРТЯ WORD DATA (.INIT$INT$VECTOR$CODE); 


CALL INITSINT$VECTORSCODE$PTR( AVECTOR.SEG); 
; STATEMENT # 281 
BX,£BP].INTVECTORPTR 


С%5Е06 СЕЗ 
26804702 LEA 
06 PUSH 
50 PUSH 
2EFF 160600 CALL 
8B4604 MOV 
83Е819 SUB 
C45E06 LES 
268907 MOV 
END; 
5D POP 
C20600 RET 
INTTINTVECTOR 


AX, ES: ЧЕСТОВ( BX+2H] 


ES 
AX 


CS: INITINTVECTORCODEPTR 
VECTOR.OFF = INT$ROUTINESOFFSET - CORRECTION; 


BP 
6H 


81 
гл 


; STATEMENT # 282 
АХ, [ВР]. INTROUTINEOFFSET 
АХ, 19Н 
BX,°BP].INTVECTORPTR 
ES: VECTOR( BX],AX 


; STATEMENT # 283 


ENDP 


/8 SEGMENT PORTION 


# / 


/% OFFSET PORTION #/ 


/% 10102020 0200 10 200 ве ва ааа ааа ааа аа аа а ае на на аа ао аа ааа а ра аа аа за 
ХАЛЛЕ 


COMMAND MODULE 


ABSTRACT 


- є — о є» 
= = = = 


THIS MODULE CONTAINS ALL THE COMMANDS IMPLEMENTED AS INDIVIDUAL PROCEDURES 
AND CALLED FROM THE OUTER BLOCK OF THE COMMAND DISPATCH LOOP. 


MODULE ORGANIZATION 


THIS MODULE CONTAINS THE SOLLOWING SECTIONS: 


1 - 


COMMANDS SECTION 
519500 
STO$SINGLESSTEP 
ЗТОЗЕХАМЗМЕМ 
STOSEXAM$REG 
STOSMOVE 
STOS$DISPLAY 


GO 
SINGLE STEP 


SUBSTITUTE MEMORY 
EXAMINE REGISTER 


MOVE 
DISPLAY BYTES 





30 


Р,/М-86 COMPILER 


284 


285 


285 


287 
288 


289 


290 


292 


293 


294 


го 


0892 
0893 


0895 


0898 
0890 


089F 


08А2 
08А6 
08А7 
08А8 
ОВАС 


ОВАЕ 
0884 
0886 


0889 
оввр 
08С0 


08C3 


08С7 
08СВ 


SDK86 SERIAL MONITOR 


STO$INPUT INPUT PORT 
510300ТРОЫТ OUTPUT PORT 
SIO$WRITE WRITE DATA RECORDS 
SIO$READ READ DATA RECORDS 

2. COMMAND DISPATCH (OUTER BLOCK, MAIN PROGRAM LOOP) 
NEXT$COMMAND DISPATCH 
ERROR ERROR ROUTINE 


/„чавнанававаанаавааанава 


5 COMMAND SECTION в 
озвепносоваовааован EEE / 


510800: 


; STATEMENT # 284 


/9 IMPLEMENTS THE '00' COMMAND. THE USER MAY SPECIFY A NEW 


ТР: РС AND AN OPTIONAL BREAKPOINT. %/ 


STOGO PROC NEAR 
55 PUSH BP 
ВВЕС MOV BP,SP 
PROCEDURE; 


CALL SILO$UPDATES$TP; 
; STATEMENT # 285 
E88DFD CALL STOUPDATEIP 
ТЕ СНАК-"," THEN /® BREAKPOINT #/ 
; STATEMENT # 286 
803Е66002С СМР СНАВ,2СН 
7536 JNZ 034 
00: 
CALL SIO$GETS$CHAR; 
; STATEMENT # 288 
E86DFA CALL ЗІОСЕТСНАВ 
CALL SIO$GET$ADDR(@BRK1,CSIP.SEG); 
: STATEMENT # 289 


8D062200 LEA АХ, ВЕК 1 

ТЕ РЈ5Н 05 ; 1 
50 PUSH AX З 
ЕЕЗ62800 PUSH CSIP+2H ; 3 
E835FD CALL STOGETADDR 


IF CHAR<>ASCR THEN GOTO ERROR; 
; STATEMENT # 299 


803E66000D CMP CHAR,ODH 
7403 JZ $+5H 
EQ94DFY JMP ERROR 


BRKISSAVE = MEMORY$BRK1; 
; STATEMENT # 292 


С%1Е2200 LES ВХ,МЕМОНҮВНКЇРТН 
268407 MOV AL,ES: MEMORY BRK1{ BX] 
A26500 MOV BRKISAVE, AL 


MEMORY$BRK1 = BREAK$INST; 
; STATEMENT # 293 
26С607СС MOV ES:MEMORYBRK1(BX],0CCH 
ТЕ MEMORY$BRK1<>BREAK$INST THEN GOTO ERROR; 
; STATEMENT # 294 
СЦ1Е2200 LES BX,MEMORYBRKIPTR 
26893FCC CMP ES:MEMORYBRK1{£BX],0CCH 


31 


PL/M-86 COMPILER 


295 


277 


298 


301 


393 


394 


305 


396 


~ 


ОВСЕ 
0801 


0804 


9809 


0808 


ОВЕО 


0822 


0825 


0853 
08Е3 


O8EE 
98Ғ1 


ОВЕЦ 


ОВЕА 


O8FD 
ОВЕЕ 


OSFF 
0900 


0902 


9995 
092А 


50К86 SERIAL MONITOR 


AND 


7403 JZ $+5Н 
E932F9 JMP ERROR 
BRKI$FLAG = TRUE; 
; STATEMENT 4 296 
СБОббБЧО0ЕЕ MOV BRKIFLAG,OFFH 
END; 
; STATEMENT # 297 
5ВОА ЈМР 937 
934: 
2555 /9 NO BREAKPOINT #/ 
ТЕ CHAR<>ASCR THEN СОТО ERROR; 
; STATEMENT # 298 
803Е660000 СМР CHAR,ODH 
7403 JZ $+5H 
292129 ЈМР ERROR 
; STATEMENT # 299 
837: 
CALL STO$CRLF; 
; STATEMENT # 300 
ESBFFB CALL SLOCRLE 
ТР з СЗІР.ОЄЕ; 
; STATEMENT # 301 
A12600 MOV АХ, СЗТР 
434890 МОУ REGSAV+18H,AX 
CS з CSIP.SEG; 
; STATEMENT # 302 
А 12809 MOV AX,CSTP+2H 
A34000 MOV REGSAV+10H,AX 
FL = FL AND (NOT STEP$TRAP); /® CLEAR ТЕ SET 9/ 
; STATEMENT # 303 
8126ШАООЕГҒҰ АМО REGSAV+1AH,OFEFFH 
CALL RESTORESEXECUTS; 
; STATEMENT # 304 
Е859Ғ% CALL RESTOREEXECUTE 
END; 
; STATEMENT # 305 
5D POP BP 
C3 RET 
51000 ENDP 
STO$SSINGLESSTEP: 
; STATEMENT # 395 
/% IMPLEMENTS THE SINGLE STEP COMMAND. DISPLAYS IP AND THE 
CURRENT INSTRUCTION BTYE. OPENS CS: ТР FOR INPUT. DEPRESSING 
COMMA CAUSES THE MONITOR TO SINGLE STEP THE INSTRUCTION, 
PERIOD TERMINATES THE COMMAND. %/ 
STOSINGLESTEP PROC NEAR 
55 PUSH BP 
ВВЕС MOV ВР, ӘР 
PROCEDURE; 
CALL 5108: РОАТЕЗТР; 
“ STATEMENT # 307 
582060 CALL ЗТОПРОАТЕТР 
(5 СНАНСО»",' THEN СОТО ERROR; 
; STATEMENT # 305 
893E56002C CMP CHAR, 2СН 
7403 JZ 3-5 


PL/M-86 COMPILER 


311 


313 


314 


315 


3 15 
317 


318 


321 


322 


323 


324 


го 


090C 


090F 
0912 


0915 
0918 


0918 


0921 


0924 
0925 


0926 
0927 


0929 


092C 
0930 
0931 
0932 
0936 


0939 
093E 
0940 


0943 


0946 
9949 
0948 


SDK86 SERIAL MONITOR 


STATEMENT # 310 


STATEMENT # 311 


STATEMENT # 312 


STATEMENT 9 313 


STATEMENT # 314 


STATEMENT # 315 


STATEMENT # 317 


STATEMENT # 318 


STATEMENT # 319 


STATEMENT # 321 


STATEMENT # 322 


STATEMENT # 323 


ЕФЕТЕВ ЈМР ERROR 
IP = CSIP.OFF; 
; 
А12600 MOV АХ, СТР 
A34800 MOV REGSAV+18H, АХ 
CS = CSIP.SEG; 
412800 моу АХ, СЗТР+2Н 
34000 MOV REGSAV+10H, AX 
FL = FL OR ЗТЕРЗТВАР; ~ 
; 
810Е%4000001 OR REGSAV+1AH, 100H 
CALL RESTORESEXECUTE; 
Е8І2ҒЕ CALL RESTOREEXECUTE 
END; 
; 
5р РОР ВР 
сз ВЕТ 
51051МС1,Е5ТЕР ENDP 
ЗТОЗЕХАМЗМЕМ: 
; 
/% IMPLEMENTS THE EXAMINE MEMORY COMMAND. ®/ 
ЗТОЕХАММЕМ PROC NEAR 
55 PUSH BP 
ВВЕС MOV BP,SP 
PROCEDURE; 
DECLARE W WORD; 
CALL SIO$TEST$WORDS$MODE; 
Е88СЕВ CALL SLOTESTWORDMODE 
CALL SIO$GET$ADDR(@ARG1,CS); 
80061400 LEA AX, ARG1 
ЈЕ PUSH DS ; 1 
50 PUSH AX ; 2 
FF364000 PUSH REGSAV+10H; 3 
ЕВАВЕС CALL SLOGETADDR 
ТР CHAR<>',' THEN GOTO ERROR; 
803Е66002С СМР CHAR, 2CH 
7403 12 $+5H 
E9C3F8 JMP ERROR 
DO WHILE TRUE; 
8148: I 
CALL SIO$OUT$BLANK; 
; 
E831FA CALL SILOOUTBLANK 
IF WORD$MODE THEN 
406900 моу AL, WORDMODE 
0008 RCR AL,1 
730C JNE 85! 


CALL STO$OUT$WORD(MEMORYSWORDS$ARG1); 


STATEMENT # 324 


PAGE 


33 


Р,/М-86 COMPILER 


325 


326 


зет 


328 


329 


333 


= w 


0980 
0951 
0954 
0957 


0959 
0950 
0960 


096 3 
0965 
0966 


0969 


096C 


096Р 
0974 


0976 
0977 


0978 
0970 


097F 
0982 


0985 
098A 
098с 
098Е 
098Е 
0990 
0995 
0997 
0999 
099А 
0998 
0990 
099F 
ОЗА 1 


5086 SERIAL MONITOR 


C4¥1E1A00 LES BX,MEMORYARGIPTR 
26FF37 PUSH ES:MEMORYWORDARG1£ BX] 
E809FA CALL SIOOUTWORD 
EBOA JMP 942 

841: 

ELSE 


CALL SIO$OUTS$BYTE( MEMORY$ARG1); 
; STATEMENT # 


C41E1A00 LES BX,MEMORYARGIPTR 
26ЕРЗ7 PUSH ЕЗ:МЕМОНҮАНО1ГВХ } 
ЕЗСОЕ9 CALL ЗТООПТВУТЕ 

#42: 


CALL SIO$OUTSCHAR('-'); 
; STATEMENT # 


вого MOV AL,2DH 
50 PUSH AX а 
Е886Ғ9 CALL STOOUTCHAR 


CALL SIO$OUTS$BLANK; 
; STATEMENT # 
ЕВОВРА CALL STOOUTBLANK 
CALL ЗІОЗСЕТУСНАЯ; 
; STATEMENT # 
E8A0F9 CALL STOGETCHAR 
ЇР CHARsASCR THEN RETURN; 
; STATEMENT # 


803E66000D CMP CHAR,ODH 
7502 JNZ 843 
; STATEMENT 8 
50 РОР ВР 
СЗ RET 
943: 


ТЕ CHAR<>',' THEN 
; STATEMENT # 


803E66002C CMP CHAR, ФСН 
745C JZ 044 
00; 
W з SIO$GET$WORD; 
; STATEMENT # 
ЕВ86ЕРВ CALL STOGETWORD 
A35200 MOV W,AX 


IF (CHAR <> ',') AND (CHAR <> ASCR) 
; STATEMENT # 


803Е66002С СМР CHAR,2CH 
BOFF MOV AL,OFFH 
7501 482 $+3H 

%0 INC AX 

50 PUSH AX а 
803Е660000 СМР CHAR,ODH 
BOF F MOV AL,OFFH 
7501 JNZ $+3H 

40 INC AX 

59 РОР CX . 1 
2201 AND АБ, CL 

0008 АСА АС, 1 

7303 JNB $+5H 

Е962Ғ8 ЈМР ERROR 


ТЕ WORD$MODE THEN 


325 


326 


327 


328 


329 


330 


333 


THEN GOTO ERROR; 
334 


РАСЕ 


34 


PL/M-86 COMPILER 


337 
338 


339 


341 


342 


343 


344 


346 
347 


348 


350 


351 


= 


= 


кол 


O9A4 
09A7 
09A9 


0948 
ОЗАЕ 
0982 


0985 
0989 
O9BC 


О9СО 


09С2 
09С5 
0969 


О9СС 
09СЕ 
0903 


0906 
0908 


0958 
0960 


09E2 
09E3 


О9ЕЦ 
09Е7 
09Е9 


09ЕВ 
09Ғ0 


SDK86 SERIAL MONITOR PAGE 


; STATEMENT # 336 


А06900 MOV AL,WORDMODE 
0008 АСК АГ, 1 
7317 JNB @u6 

ро: 


MEMORY$WORD$ARGI = W; 
; STATEMENT # 338 


A15200 MOV AX,W 
C41E1A00 LES BX, MEMORYARGIPTR 
268907 MOV ES:MEMORYWORDARG1(BX],AX 


ТЕ MEMORY$WORD$ARG1<>W THEN GOTO ERROR; 
; STATEMENT # 339 


СЦ1ЕТАОО LES ВХ, МЕМОНХАКС 1РТН 
268807 MOV AX,ES:MEMORYWORDARG1[ BX] 
38065200 СМР AX,W 
EB14 JMP 811 
ЕМО; 
; STATEMENT # 341 
046: 
ELSE 
DO; 
MEMORY$ARG1 = LOW(W); 
; STATEMENT # 343 
A15200 MOV AX,W 
C4¥1E1A00 LES BX,MEMORYARGIPTR 
268807 MOV ES:MEMORYARG1{BX],AL 
ТЕ MEMORY$ARG1<>LOW(W) THEN GOTO ERROR; 
; STATEMENT # 344 
A15200 MOV АХ, И 
СЦ 1ЕТАФО LES BX,MEMORYARGIPTR 
263807 CMP ES:MEMORYARG1(BX],AL 
011: 
7403 42 $+5H 
Е92ВЕ8 ЈМР ERROR 
; STATEMENT # 3155 
END; 
END; 
645: 


ТЕ CHAR=ASCR ТНЕМ RETURN; 
; STATEMENT # 348 


803Е66000р СМР CHAR,ODH 
7502 JNZ 955 
; STATEMENT # 349 
5D POP BP 
C3 RET 
850: 


IF WORD$MODE ТНЕН 
: STATEMENT 4 350 


A06900 MOV AL,WORDMODE 
0008 АСВ АС, 1 
7307 JNB 851 


ARG1.OFF = ARG1.0FF + 2; 
; STATEMENT # 351 
83061A0002 ADD ARG1,2H 
ЕВО5 ЈМР 052 
951: 
ELSE 


35 





PL/M-86 COMPILER 


SDK86 SERIAL MONITOR 


352 3 ARG1.OFF = АВС1,О0ЁР + 1; 
; STATEMENT 352 
09F2 83061A0001 ADD ARG1,1H 
852: 
353 3 CALL SIO$CRLF; 
; STATEMENT 353 
09F7 E8ADFA CALL SIOCRLF 
354 з CALL SIO$OUT$WORD(ARG1.,OFF); 
; STATEMENT 354 
09ҒА FF361A00 PUSH ARG1 . 4 
09ЕЕ E85FF9 CALL STOOUTWORD 
355 3 END; 
: STATEMENT 355 
ДАО E93FFF JMP 8148 
9149: 
356 2 END; 
$ STATEMENT 356 
ОАОЦ 50 РОР ВР 
0405 СЗ RET 
STOEXAMMEM ENDP 
357 1 SIO$EXAM$REG: 
; STATEMENT # 357 
/9 IMPLEMENTS THE EXAMINE REGISTER COMMAND. SCANS FOR A VALID 
REGISTER NAME AND DISPLAYS THE VALUE OF THAT REGISTER WHICH IS 
OPTIONALLY OPENED FOR INPUT. COMMA INCREMENTS TO NEXT REGISTER 
UNLESS ІТ IS 'FL' WHICH TERMINATES AS DOES CR. 
ЗТОЕХАМВЕС PROC NEAR 
0406 55 PUSH BP 
0А07 8BEC MOV BP,SP 
PROCEDURE; 
358 2 DECLARE (T,I) BYTE, SAVE WORD; 
359 2 CALL ЗІОЗЗСАНЗВСАНК; 
; STATEMENT 359 
0509 E8D2FA CALL SIOSCANBLANK 
360 2 IF СНАН-А5ЗСН THEN 
; STATEMENT 360 
ОАОС 803Е660000 CMP CHAR,ODH 
OA11 7559 482 853 
361 2 DO; 
362 3 CALL SIO$CRLF; 
; STATEMENT 362 
0А13  Е891БЕА CALL STOCRLPF 
363 3 DO 140 ТО 13; 
; STATEMENT 363 
0A16 C€C606700000 MOV Т.9098 
2150: 
ОА1В 803Е700000 СМР Т, ООН 
0420 7748 ЈА 0151 
364 4 CALL SIO$OUT$BLANK; 
; STATEMENT 364 
0422 E852F9 CALL SIOOUTBLANK 
365 4 CALL STO$OUTSCHAR( НЕС(Т?2)); 
; STATEMENT # 365 
0425 407000 MOV 1121 
0428 8102 MOV CL. 2a 
OA2A F6E1 MUL CL 


PAGE 


36 


РО/М-86 COMPILER 


OA2C 

OA2E 

OA32 
365 ч 


0А35 

0438 

ОАЗА 

ОАЗС 

ОАЗЕ 

OA42 
367 ü 


OA4S 

0447 

0А48 
368 4 


OA4B 
ОАЧЕ 
0451 
0453 
0456 


0459 
ОАБЕ 


ОА6О 
371 4 


0A6 3 
0468 


372 3 


ОАбА 
OA6B 
373 3 


371 2 


0А6С 

ОАбЕ 

0471 

0473 

0475 
376 2 


ОА78 
ОА?В 
377 2 


ОАТЕ 
378 а 


SDK86 SERIAL MONITOR 


BX,AX 
СЗ: ВЕС! BX] 
SIOOUTCHAR 


CALL STO$OUTSCHAR( REG(I#2+41)); 


; STATEMENT # 366 
AL,I 
CL,2H 
СЕ 
ВХ,АХ 
СЗ: НЕСГВХ+ТН ) 
ЗІООЧТСНАВ 


CALL SIO$OUT$CHAR('='); 


: STATEMENT # 367 
AL, ЗОН 
АХ 5 1 
STOOUTCHAR 


CALL SLOSOUT$WORD(REG$SAV(I)); 


; STATEMENT # 368 
BL,I 
BH,OH 
вх, 1 
НЕСЗАУ BX]; 1 
SLOOUTWORD 


ТЕ Таб THEN CALL ТОЗСА: 


; STATEMENT # 369 


1,68 
954 

; ЗТАТЕМЕМТ # 370 
SIOCRLF 

; STATEMENT # 371 
1,14 
3150 

; STATEMENT # 372 
ВР 


ТЕ NOT(SIO$VALID$REG$FIRST) THEN GOTO ERROR; 


89C3 МОМ 
2ЕЕЕ7758 PUSH 
ЕЗВАЕВ CALL 
A07000 MOV 
8102 МОМ 
F6E1 MUL 
89C3 MOV 
2EFF7759 PUSH 
E8AAF8 CALL 
8030 МОУ 
50 PUSH 
ЕВАЧЕВ CALL 
ВА 1Е7000 МОУ 
8700 MOV 
О1ЕЗ SHL 
FF7730 PUSH 
E807F9 CALL 
803Е700006 СМР 
7503 JNZ 
ЕВЦЦЕА CALL 
854: 

END; 
8006700001 ADD 
7561 JNZ 

0151: 

RETURN; 
5D POP 
СЗ RET 

END; 

853: 
Е8С2Е9 CALL 
Е6р0 NOT 
5008 RCR 
7303 JNB 
EQSEF7 JMP 
Т, = CHAR; 
406600 МОМ 
А26ЕО0 MOV 


CALL SIO$GETSCHAR; 


E88EF8 CALL 


; STATEMENT # 374 


STOVALTDR&EGFIRST 
AL 
AL,1 
$+5H 
ERROR 
; STATEMENT й 375 
AL,CHAR 
T,AL 
; STATEMENT # 377 
ЗІОСЕТСНАВ 


ТР NOT(SIO$VALID$REG(T,CHAR)) THEN GOTO ERROR; 


; ЗТАТЕМЕМТ # 378 


РАСЕ 


37 


PL/M-86 COMPILER 


ОА81 
0485 
ОА89 
ОАВС 
OASE 
0490 
0492 
380 г 


0495 
0498 
381 г 


382 3 


0А9В 

0А90 

0А9Е 
383 3 


0АА1 

OAAS 

ОДА? 

ОДА 

ОААС 
388 3 


OAAF 

0АВ1 

OAB2 
385 3 


0АВ5 
386 3 


0188 
387 3 


OABB 
ОАСО 
ОАС2 
ОАСЦ 
ОАС5 
0АС6 
0АСВ 
OacD 
OACF 
OADO 
ОАР 1 
OAD3 
0495 


0А07 
ДАРА 


SDK86 SERIAL MONITOR 


FF366F00 PUSH T а 4 
FF366600 PUSH CHAR . ; 2 
Е80ШЕ9 CALL STOVALIDREG 
2600 NOT AL 
0008 АСА AL, 1 
7303 JNB 3-5Н 
6971Е7 ЈМР ERROR 
I = REG$INDEX; 
; STATEMENT 
A12E00 MOV АХ, REGINDEX 
A27000 MOV T,AL 
DO WHILE TRUE; 
; STATEMENT 
@152: 
CALL ЗТОЗОПТЗСНАЯ( "з"); 
; STATEMENT 
8030 мо“ АС, ЗОН 
50 РОЗН АХ 4. 1 
ЕЗЦЕРЗ CALL ЗТООЧТСНАЯ 
CALL SIOSOUTSWORD(REGS$SAV(I)); 
$ STATEMENT 
8A1E7000 MOV BL, L 
B700 МОУ ВН, ЭН 
0153 SHL BX, 1 
FF7730 PUSH REGSAV( BX]; 1 
E8B1F8 CALL SIOOUTWORD 
CALL ФТОЗОЏТЗСНАА("-"). 
; STATEMENT 
8020 MOV AL,2DH 
50 PUSH AX 5 4 
ЕВЗАЕ8 CALL 51000ТСНАН 
CALL ЗІОФОЧТУВСАНК; 
: ЗТАТЕМЕНТ 
ЕВВЕЕВ CALL STOOUTBLANK 
CALL SIO$GETSCHAR; 
: STATEMENT 
E854F8 CALL STOGETCHAR 
IF СНАК<>',' AND CHAR<>ASCR THEN 
; STATEMENT 
803Е66002С СМР СНАЯ, 2СН 
ВОРР МОУ AL,OFFH 
7501 JNZ $+3H 
40 INC АХ 
50 PUSH AX е 4 
803£66000D CMP СНАН,ООН 
BOF F MOV AL,OFFH 
7591 JNZ $+3H 
40 INC АХ 
59 РОР CX ; 1 
2201 АМО АС, СЪ, 
0008 RCR AL, 1 
7333 JNB 857 
00; 


ЗАМЕ = SLO$GETS$WORD; 


E816FA CALL 
A35400 MOV 


380 


381 


382 


383 


384 


385 


386 


387 


; STATEMENT # 389 


ЗТОСЕТИОКО 
ЗАУЕ, АХ 





PAGE 


38 


РІ,/М-86 COMPILER 


390 4 


OADD 
OAE2 
ОАЕЧ 
OAE6 
ОАЕТ 
ОАЕВ 
ОАЕО 
ОАЕЕ 
ОАЕ 1 
ОАЕФ 
ОАЕЗ 
ОАЕ5 
ОАЕТ 
OAFY 
392 4 


OAFC 

0800 

овог 

ОВОЦ 

0807 
393 4 


394 3 


ОВОА 
OBOF 
0B11 
0B13 
0814 
0815 
ОВІА 
081С 
ОВ:Е 
ОВТЕ 
0820 
0822 
OB24 


0B26 
0827 


0828 
397 3 


0820 
398 3 


0830 
0833 
0835 
0837 
0839 


SDK86 SERIAL MONITOR 


IF (CHAR <> ' 


" ) AND (CHAR <> ASCR) THEN GOTO ERROR; 


; STATEMENT # 390 


AX . 17 
CHAR,ODH 
AL,OFFH 
$+3H 

AX 

CX 24 
АҺ, CL 

AL, 1 

$+5H 

ERROR 


SAVE; 


; STATEMENT # 392 
BL, I 
BH,OH 
BX, 1 
AX,SAVE 
ВЕСЗАУ[ ВХ] ‚АХ 


ТЕ CHAR=ASCR OR 1-13 THEN RETURN; 


; ЗТАТЕМЕНТ # 394 
СНАК, ООН 
AL,OFFH 
$+3H 
AX 


; STATEMENT # 395 


; STATEMENT # 396 
I, 1H 


; STATEMENT # 397 
SIOCRLF 


CALL SIO$OUT$CHAR(REG(I*#2)); 


803E66002C CMP 
BOFF MOV 
7501 JNZ 
40 INC 
50 PUSH 
803E66000D CMP 
BOFF MOV 
7501 JNZ 
10 ІМС 
59 РОР 
2201 AND 
0008 АСА 
7303 JNB 
E90AF7 ЈМР 
REG$SAV(I) з 
8A1E7000 MOV 
B700 MOV 
01Е3 SHL 
А15400 MOV 
894730 MOV 
END; 

@57: 
803E66000D CMP 
BOFF MOV 
7401 92 
40 INC 
50 PUSH 
803E79000D CMP 
BOFF MOV 
7401 JZ 
4Q INC 
59 POP 
OAC1 OR 
DOD8 RCR 
1302 JNB 
5D POP 
C3 RET 

@59 

I = I 1; 
8006700001 ADD 

CALL SIO$CRLF; 
E877F9 CALL 
A07000 MOV 
8102 МОМ 
F6E1 MUL 
89C3 MOV 
2ЕЕЕ7758 РЏ5Н 


; STATEMENT # 393 
ІШІ 
CL,2H 
CL 
BX, AX 
CS: НЕС ВХ) 


РАСЕ 


39 


PL/M-86 COMPILER 50К36 SERIAL MONITOR PAGE 
0830 «ЗАРЕ7 CALL SIOOUTCHAR 
399 3 CALL SIOSOUTSCHAR( REG(I#241)); 
; STATEMENT # 399 
0850 А07000 MOV AG yt 
0843 8192 MOV CL, 2H 
0845 Ғ6ЕТ MUL си 
0847 3963 мом ВХ, AX 
3849 2EFF7759 PUSH CS:REG(BX+1H] 
9840 «89887 CALL SIQOUTCHAR 
800 3 END; 
; STATEMENT # 400 
0850 E943FF ЈМР 2152 
9153 
401 2 END; 
; STATEMENT # 401 
0853 50 РОР ВР 
9854 C3 RET 
ЗІОЄХАЙВЕС ENDP 
802 1 3125М0У2: 
; ЗТАТТМЕХ7 8 402 
/8 IMPLEMENTS THE MOVE COMMAND. ACCEPTS 3 ARGUMENTS AMD MOVIS THE 
BLOCK 97 MEMORY SPECIFIED BY ARGI-ARG2 ТО ARG3. АЗО24А821 OR THERE 
15 A DIFFERENCE WHEN THE BYTS IS READ BACK, THEN SRAGR. #/ 
SIOMOVE PROC NEAR 
0855 55 PUSH BP 
0856 авес MOV ЗР, SP 
PRICEDURE; 
493 2 CALL SLO$SCANSBLANK; 
; STATEMENT # 403 
0858  5833Е9 CALL ЗІОЗСАНВСАНК 
404 2 CALL STO$GET$ADDR(@ARG1,CS); /% FIRST ARGUMENT #/ 
; STATEMENT # 404 
1838 30051307 44 АХ, ААС! 
3858 1: РУЗН DS ; 1 
0860 52 РУЗН АХ ; 2 
0861 77364009 PUSH REGSAV+10H; 3 
0865 ES87CFA CALL 5120%ТА00В 
405 2 ЇР CHAR<>',' THEN GOTO ERROR; 
; STATEMENT 1 495 
2868 803=55002С CMP СНАЗ,20Н 
9860 7403 22 $+3H 
ОВ6Е Е99%Ғ6 ЈМ? ERROR 
1407 2 CALL 519358 ТЗСНАА; 
; ЗТАТЕМЕЧТ # 407 
2872  ЕЗЗАЄ" CALL SIOGETCHAR 
498 2 ЕЧОЧОРЕ = STOS$SETS$WORD; /9 SECOND ARGUMENT »/ 
; STATEMENT # 408 
0875 £37379 CALL SIOGETWORD 
0873 431800 MOV ENDOFF,AX 
409 2 IF ЕМОЗОРРСААСТ.ОРЕ THEN GOTO ERROR; 
; STATEMENT 9 429 
2878 A112309 мом АХ, ЕМООЕЕ 
287: 38051409 CHP АХ, ARGI 
2832 7493 JNB 5.54 
BSU 22745 ЈМР 28802 
411 2 i? CHAR<>’,’ THEN GOTO ERROR: 


40 





Р,/М-86 COMPILER 


413 


415 


417 


418 


419 


421 


423 


124 


425 


426 


0887 
088С 
0В8Е 


0891 


0894 
0898 
0899 
ОВЗА 
0В9Е 


ОВА1 
OBA6 
OBA8 


OBAB 


OBAE 
OBB2 
0885 
0889 


ОВВС 
ОВСО 
ОВСЗ 
08С7 
ОВСА 
OBCC 


OBCF 
OBD2 
0806 


0808 
0В09 


ОВОА 


OBDF 


ОВЕЦ 


SDK86 SERIAL MONITOR 


. 
, 


LOOP: 


STATEMENT # 


411 


113 


ARGUMENT %/ 
18 


415 


ці? 


418 


419 


421 


422 


423 


124 


425 


803Е66002С СМР CHAR, 2CH 
7403 dz $+5H 
297526 ЈМР ERROR 
CALL SIO$GET$CHAR; 
: STATEMENT # 
E87BF7 CALL SIOGETCHAR 
CALL SIO$GET$ADDR( @ARG3,CS); /8 THIRD 
- STATEMENT # 
8D961E00 LEA AX,ARG3 
1Е PUSH DS ; 4 
50 PUSH AX . 2 
FF 364000 PUSH REGSAV+10H; 3 
ЕВЦЗЕА CALL SIOGETADDR 
IF CHAR<>ASCR THEN GOTO ERROR; 
; STATEMENT й 
803£66000D CMP CHAR,ODH 
7403 27 $+5H 
E9SBF6 JMP ERROR 
CALL SIO$CRLF; 
; STATEMENT # 
E8F9F8 CALL SIOCRLF 
; STATEMENT # 
LOOP: 
MEMORY$ARG3 = MEMORYS$ARG1; 
СЦТЕТАОО LES BX,MEMORYARGIPTR 
268407 MOV AL,ES:MEMORYARGIS BX] 
C41E1200 LES BX,MEMORYARG3PTR 
268807 MOV ES:MEMORYARG3( ВХ ] ‚АГ 
ТЕ MEMORY$ARG3<>MEMORY$ARG1 THEN GOTO ERROR; 
; STATEMENT й 
C41E1E00 LES BX,MEMORYARG3PTR 
268A07 MOV АС, Е$ : МЕМОВУАВС 3 [ BX] 
C41E1A00 LES BX,MEMORYARGIPTR 
263A07 CMP А.,ЕЗ:МЕМОНҮАНО1Г BX] 
7403 JZ $+5H 
Е937Е6 ЈМР ERROR 
ТЕ ARG1.OFF = ENDS$OFF THEN RETURN; 
; STATEMENT й 
A11A00 MOV AX, АВС 1 
38061800 СМР AX, ENDOFF 
7502 JNZ 955 
; ФТАТЕМЕНТ # 
50 РОР ВР 
СЗ RET 
055: 
ARG1.OFF = ARG1.OFF + 1, 
; STATEMENT # 
83061A0001 ADD ARG1,1H 
ARG3.OFF з ARG3.OFF + 1; 
; STATEMENT # 
83061Е0001 ADD ARG3,1H 
GOTO LOOP; 
; STATEMENT # 
ЕВСВ ЈМР LOOP 
END; 


PAGE 


41 


Р,/М-86 COMPILER 


SDK86 SERIAL MONITOR 


STOMOVE ENDP 
427 1 SLOSDISPLAY: 
; STATEMENT # 427 
/% IMPLEMENTS THE DISPLAY BYTE COMMAND. ТЕ CALLED WITH 1 PARM THEN 
OUTPUTS A SINGLE BYTE. IF CALLED WITH 2 PARMS THEN OUTPUTS THE RANGE 
BETWEEN THE TWO ADDRESSES. ТЕ OFFSET<BEGIN THEN OUTPUTS ONLY A SINGLE 
BYTE. ®/ 
SIODISPLAY PROC NEAR 
OBE6 55 PUSH BP 
ОВЕТ ЗВЕС MOV BP,SP 
PROCEDURE; 
428 2 DECLARE Т BYTE; 
429 2 CALL SIO$TEST$wORD$MODE; 
; STATEMENT # 429 
OBEY ЕВССЕВ CALL STOTESTWORDMODE 
430 2 CALL SIO$GETSADDR(9ARG1,CS); 
; STATEMENT # 430 
OBEC 8D061A00 LEA AX, ARG1 
OBFO 1E PUSH DS 51 
0ВЕ1 50 PUSH AX . 2 
ОВЕ2 FF364000 PUSH REGSAV+10H; 3 
ОВЕ5  ЕЗЕВЕЗ CALL SIOGETADDR 
431 2 ТЕ CHARsASCR THEN 
; STATEMENT # 431 
ОВЕ9 8032560000 CMP CHAR,ODH 
OBFE 7508 JNZ 966 
432 2 ENDSOFF = АВС1,ОЁР, 
; STATEMENT # 432 
ОСОО А11А00 MOV AX,ARG1 
0C03 13431300 MOV ENDOFF, AX 
0606 EB29 JMP NEWLINE 
856: 
ELSE 
433 2 ро: 
434 3 ТЕ СНАВО»"',' THEN GOTO ERROR; 
; STATEMENT # 434 
0С08  803Е656002С CMP CHAR, 2CH 
OCOD 7403 JZ $+5Н 
ОСОЕ Е9ҒШЕ5 ЈМР ERROR 
436 3 CALL ФТОЗОЕТЗСНАА; 
; STATEMENT # 436 
0С12 ES8FAFS6 CALL STOGETCHAR 
437 3 END$SOFF = SIO$GETS$WORD; 
; STATEMENT # 437 
0С15 ЕВОВЕВ CALL STOGETWORD 
0c18 A31800 MOV SNDOFEF, АХ 
438 3 IF ЕМОЗОЕЕ < ARG1.0FF THEN GOTO ERROR; 
; STATEMENT # 438 
0С18 411800 М0У AX, ENDOFF 
ОС1Е 32961A00 CMP АХ, ААС1 
0C22 7303 JNB $+5H 
0С2% Е9ПЕЕ5 ЈМР cRROR 
440 3 ТЕ CHAR<>ASCR THEN SOTO ERROR; 
; STATEMENT 8 440 
OG 2 7 803Е660000 СМР CHAR,ODH 
2626 7403 1: $+5H 


РО/М-86 COMPILER 


442 
443 


Ццц 


445 


446 


147 
448 


449 


451 


452 


453 


usy 


«о 


го 


0С2Е 


0031 


0c34 
0с33 


0C 3B 


ОСЗЕ 
09041 
0043 


ocus 
ОСЦ9 
ОСЦС 


ОСЧЕ 
0052 
0056 


0058 
9659 


OCSA 


ОСБЕ 


0С6 1 
ОСБ5 
0068 


0С6В 
ОСбЕ 
Фета 


ОС7Ц 
9675 


SDK86 SERIAL МОМТТОВ 


# 


it 


Е905Е5 ЈМР ERROR 
END; 
NEWLINE: 
; STATEMENT 
NEWLINE: 
CALL SIO$CRLF; 
E873F8 CALL STOCRLF 
CALL STO$OUT$WORD(ARG1.OFF); 
; STATEMENT 
FF361A00 PUSH ARG1 81 
Е825Е7 CALL 51000ТЧОНО 
LOOP: CALL SIO$OUT$BLANK; 
; STATEMENT 
LOOP: 
Е839Е7 CALL SIOOUTBLANK 
IF WORD$MODE THEN 
; STATEMENT 
106909 МОУ AL,WORDMODE 
0008 RCR AL, 1 
7316 JNB 871 
00; 
CALL ЗТОЗОЦТ$ НОВО ( MEMORY$WORD$ARG1); 
; ЗТАТЕМЕМТ 
СЦ1ЕТАОО LES BX,MEMORYARGIPTR 
26FF37 PUSH ES:MEMORYWORDARGI(BKX] 
E811F7 CALL SIOOUTWORD 
IF ARG1.,.OFF = END$OFF THEN RETURN; 
: STATEMENT 
A11A00 MOV AX,ARG1 
38061800 СМР AX, ENDOFF 
7502 JNZ 372 
; STATEMENT 
5р РОР ВР 
СЗ КЕТ 
972: 
АВОТ „ОБЕ = ARGI.OFF + 1; 
; STATEMENT 
83061A0001 ADD АВС1,1Н 
END; 
; STATEMENT 
EBOA JMP 873 
871: 
ELSE 
CALL SIO$OUT$BYTE(MEMORYSARG1); 
; STATEMENT 
C4¥1E1A00 LES BX,MEMORYARGIPTR 
25FF37 PUSH ES:MEMORYARG1% BX] 
E8C5F6 CALL 51209ТВҮТЕ 
Ө73: 
ТЕ АВС1.ОЕГ>-ЕМр%9ОЕЕ THEN RETURN; 
; STATEMENT 
A11A00 MOV 4X,ARG1 
38051800 СМР АХ,ЕМООЁЕ 
7202 ЈВ 871 
; STATEMENT 
50 РОР ВР 
СЗ RET 


143 


444 


145 


446 


448 


44g 


450 


451 


452 


453 


454 


455 


РАСЕ 


43 


PL/M-86 COMPILER 


460 


461 


462 


463 
464 


465 


466 


468 


0076 


0С7В 
ОСТЕ 
0081 


0085 
0089 
ОСВВ 
ОСВО 
ОСЗЕ 
ОСВЕ 
0С94 
0096 
00938 
0699 


70690 


0С9Е 
OCAO 
OCA2 


ОСА 


OCA6 
ОСА? 


ОСА9 


ОСАС 
ОСАЕ 


0СВ2 
0С87 
089 


ОСВС 


50К86 SERIAL MONITOR 


875: 
ARG1.OFF з ARG1,OFF + 1; 


-.. 


ЗТАТЕМЕМТ 9 456 


8306 140001 ADD ARG1,1H 
T = ARG1.OFF AND OOOFH; 
; STATEMENT # 457 
A11A00 MOV AX, АВС! 
250F00 AND АХ,ОЕН 
427100 MOV T,AL 
ТЕ Т:0 OR (WORD$MODE AND Т-1) THEN GOTO NEWLINE; 
; STATEMENT # 458 
8238710000 СМР Т, ОН 
ВОЕЕ MOV AL,OFFH 
7401 Ј2 $+3H 
40 INC AX 
50 PUSH AX 53 
803Е710001 СМР T,1H 
BOF F MOV АС, ОРРН 
7401 Ј2 $+3H 
10 ІМС АХ 
22066900 AND AL,WORDMODE 
59 POP СХ . 1 
OAC! OR AL,CL 
0008 АСА AL,1 
728D JB NEWLINE 
GOTO LOOP; 
; STATEMENT # 460 
2895 ЈМР LOOP 
END; 
STODISPLAY ENDP 
ЗІОЗІМРОТ: 
; STATEMENT # 462 
/® THIS ROUTINE IMPLEMENTS THE ‘INPUT’ COMMAND. USER SPECIFIES 
A PORT AND THE DATUM OF THE PORT 15 DISPLAYED. #/ 
SIOINPUT PROC NEAR 
55 PUSH BP 
8BEC MOV BP,SP 
PROCEDURE; 
DECLARE PORT WORD; 
CALL SITO$TESTSWORDSMODE; 
| ; STATEMENT # 464 
ЕВОСЕВ CALL SITOTESTWORDMODE 
PORT = SIO$GETSWORD; 
; STATEMENT 9 465 
ЕЗЦТЕЗ CALL STOGETWORD 
A35600 MOV PORT, AX 
LOOP: 
; STATEMENT й 466 
LOOP: 
803Е66002С СМР CHAR, 2CH 
7403 92 $+5Н 
SO4AFS JMP ERROR 
ТЕ CHAR<>',° THEN GOTO ERROR; 
CALL SIO$CRLF; 
; STATEMENT # 468 
ЕЗЕЗЕ? CALL SIOCRLF 


PAGE 


цу 





~ 


РО/М-86 COMPILER 


SDK86 SERIAL MONITOR 


469 2 IF WORD$MODE THEN 
; STATEMENT й 469 
ОСВЕ А06900 MOV AL,WORDMODE 
occ2 0058 RCR AL, 1 
OCC4 7308 JNB 877 
470 2 CALL SIO$SOUT$WORD( INWORD(PORT)); 
; STATEMENT # 470 
OCC6 8В155600 MOV DX,PORT 
OCCA ED INW DX 
ОССВ 50 PUSH AX : 1 
ОССС E891F6 CALL SIOOUTWORD 
ОССЕ ЕВ09 ЈМР 978 
977; ! 
ELSE 
471 2 CALL SIO$OUT$BYTE(INPUT(PORT)); 
‚ STATEMENT # 471 
OCD1 88165600 MOV DX,PORT 
0605 20 IN DX 
9606 50 PUSH AX : 1 
OCD7 585626 CALL SIOOUTBYTE 
978: 
472 2 CALL SIO$GET$CHAR; 
; ЗТАТЕМЕМТ й 472 
OCDA E832F5 CALL ЗІОСЕТСНАВ 
473 2 ТЕ CHAR=ASCR ТНЕМ RETURN; 
| ; STATEMENT # 473 
осрр 803Е660000 CMP CHAR,ODH 
ОСЕ2 75СЕ JNZ LOOP 
; STATEMENT й 474 
OCE4 5D POP BP 
ОСЕ5 СЗ RET 
475 2 GOTO LOOP; 
476 2 END; 
SIOINPUT ENDP 
477 1 SIO$OUTPUT: 
: STATEMENT й 477 
/% THIS ROUTINE IMPLEMENTS THE ‘OUTPUT’ COMMAND. 
DATUM IS OUTPUT TO THE SPECIFIED PORT. #/ 
51000ТРОЫТ PROC NEAR 
OCE6 55 PUSH BP 
ОСЕ? 8BEC MOV BP,SP 
PROCEDURE; 
478 2 DECLARE (DATUM,PORT) WORD; 
479 2 CALL SIO$TEST$WORD$MODE; 
; STATEMENT # 479 
0СЕ9 ES8CCF7 CALL SLOTESTWORDMODE 
480 2 PORT = STO$GET$WORD; | 
; STATEMENT й 489 
ОСЕС E801F8 CALL SIOGETWORD 
OCEF A35A00 MOV PORT, АХ 
481 2 ТЕ CHAR<>’,' THEN GOTO ERROR; 
; STATEMENT % 481 
ОСЕ2 803Е66002С CMP CHAR, 2СН 
OCF7 7403 42 $+5H 
ОСЕ9  ЕЗОАЄ5 JMP ERROR 


483 


го 


CALL STO$GET$CHAR; 


THE USER SUPPLIED 


PL/M=-86 COMPILER 


SDK86 SERIAL MONITOR 


; STATEMENT 


ОСЕС Е810Ғ6 CALL ЗІОСЕТСНАВ 
484 2 LOOP: 
: STATEMENT 
LOOP: 
DATUM = SIO$GET$WORD; 
OCFF ES8EEFT7 CALL STOGETWORD 
0002 А35800 MOV DATUM, AX 
485 2 IF СНАВ=':’ THEN GOTO ERROR; 
‚ STATEMENT 
0005 803Е66003А СМР СНАВ,ЗАН 
ODOA 7503 JNZ $+5Н 
ODOC  ЕЭРТЕЦ УМР ERROR 
487 2 IF WORD$MODE THEN 
; STATEMENT 
ODOF 4006900 MOV AL,WORDMODE 
0012 0008 RCR AL, 1 
0014 730A JNB 882 
488 2 OUTWORD(PORT) = DATUM; 
STATEMENT 
0016 8В165А00 MOV DX, PORT 
001А | А15800 MOV AX, DATUM 
0010 EF OUTW DX 
001Е 2808 ЈМР 883 
082 
ELSE 
489 2 00ТРЫТ(РОВТ) = LOW( DATUM); 
; STATEMENT 
0920 А15800 MOV AX, DATUM 
0023 88165400 MOV DX,PORT 
0027 ЕЕ OUT DX 
983: 
490 2 ТР СНАН-!," THEN 
; STATEMENT 
0028 803Е66002С СМР CHAR,2CH 
0020 7516 JNZ е8ц 
ц91 2 ро: 
ц92 3 CALL SIO$CRLF; 
ЗТАТЕМЕМТ 
0D2F Е875Е7 CALL STOCRLF 
493 3 CALL ФТОЗОЏТЗСНАА("-"); 
STATEMENT 
0032 8020 MOV AL,2DH 
0034 50 PUSH AX 8% 74 
0035 Е8ВТҒ5 CALL STOOUTCHAR 
494 3 CALL SIO$OUTS$BLANK; А 
› ЗТАТЕМЕНТ 
0038 E83CF6 CALL STOOUTBLANK 
495 3 CALL SIO$GETSCHAR; 
; STATEMENT 
0038 E8D1F5 CALL SIOGETCHAR 
496 3 IF CHAR <> ASCR THEN GOTO LOOP; 
; STATEMENT 
ООЗЕ 803Е66000р СМР СНАЯ, ООН 
0043 75ВА JNZ LOOP 
; STATEMENT 
498 3 END; 


483 


485 


487 


488 


490 


494 


495 


497 


РАОБ 





46 


РЫ/М-86 COMPILER SDK86 SERIAL MONITOR PAGE 


439 


509 


507 


508 


509 


511 


512 


w Г 


084: 
ЕНО; 
; STATEMENT # 499 
0045 5D POP BP 
0046 C3 RET 
STOOUTPUT ENDP 
STO$WRITE: 


; STATEMENT # 500 
/% IMPLEMENTS THE PAPER TAPE WRITE COMMAND. OUTPUTS LEADING NULLS, 
EXTENDED ADDRESS RECORD (8086 ONLY), START ADDRESS RECORDS 
(8086 ONLY), DATA RECORDS, EOF RECORD, AND TRAILING NULLS. #/ 


ЗТОМАТТЕ РВОС МЕАВ 
0047 55 РОЗН ВР 
0048 8ВЕС МОУ ВР, ЗР 
PROCEDURE; 


DECLARE (START$REC,MODE$8085) BYTE, (LEN,INDEX) WORD; 
CALL SIO$GET$CHAR; 
; STATEMENT # 502 
ООЧА E8C2F5 CALL ЗТОСЕТСНА К 
MODE$8086 = TRUE; 
; STATEMENT # 503 


0040 C6067300FF MOV МООЕЗОЗ6, ОЕЕН 
IF СНАВ-!Х" THEN и” TEST FOR 8080 MODE #/ 
; STATEMENT # 504 
0052  803Е662058 CMP CHAR,53H 
0057 7508 JNZ 986 
DO; 


MODE$8085 = FALSE; 
; STATEMENT # 505 
0059 66967500092 MOV MODE8086,0H 
CALL SIO$GETS$CHAR; 
; STATEMENT # 507 
005Е ЕВАБЕ5 CALL ЗІОСЕТСНАВ 
210; 
286: 
ТЕ CHAR=ASBL THEN CALL SIO$GET$CHAR; 
; STATEMENT # 509 


0061 803£660020 СМР CHAR, ФОН 
0D66 7503 JNZ 887 
; STATEMENT # 510 
0068  ЕВАЦЕ5 CALL SIOGETCHAR 
087: 


CALL SIO$GET$ADDR(@ARG1,CS); 
| ; STATEMENT # 511 


0068 8р061А00 LEA AX,ARG1 

OD6F 1E PUSH DS ; 1 
0070 50 PUSH AX ; е 
0071 FF364000 PUSH REGSAV+10H; 3 
0075 Е86СЕ8 CALL STOGETADDR 


ТЕ CHAR<>',* THEN GOTO ERROR; 
; STATEMENT # 512 


0078 803Е66002С СМР CHAR,2CH 
0070 7403 JZ $+5H 
ООТЕ EQ3UFY JMP ERROR 


CALL SIO$GET$CHAR; 
; STATEMENT # 514 


47 


РЬ/М-86 COMPILER 


919 


518 


523 


922 


523 


530 


531 


w ~ 


0082 


0085 
0088 


0088 
0085 
0092 
0094 


9997 
0096 


0D9E 


ЈОАЗ 


ODA6 
ODAA 
ODAB 
ODAC 
0080 


0083 


0085 


ODBA 


орсо 


00С5 
О0С7 


ODCA 


оосо 


0002 


SDK86 SERIAL MONITOR 


ЕВВАЕ5 CALL STOGETCHAR 
ЕНОЗОЕЕ = SIO$GETS$WORD; 
; STATEMENT # 515 
E868F7 CALL STOGETWORD 
A31800 MOV ENDOFF, AX 
IF END$OFF<ARG1.OFF THEN GOTO ERROR; 
; STATEMENT # 515 


A11800 MOV АХ, ENDOFF 
38061400 CMP АХ, АВС1 
7303 JNB $+5H 
ES6FF4 JMP ERROR 
TF CHAR<>ASCR THEN 
; STATEMENT # 518 
803Е650000 СМР CHAR,ODH 
7417 42. 290 
00; 


START$REC = TRUE; 
; STATEMENT # 520 
C6067200FF MOV STARTREC,OFFH 
CALL 51030ЕТУСНАВ, 
; STATEMENT # 521 
E869F5 CALL STOGETCHAR 
CALL SIOSGETS$ADDR(@ARG3,CS); 
; STATEMENT # 522 


80061500 LEA АХ ,АВОЗ 
1Е PUSH DS 5. 4 
50 PUSH AX : 2 
ҒЕЗ64000 PUSH REGSAV+10H; 3 
283128 CALL SIOGETADDR 

END; 

; STATEMENT # 523 

ЕВОВ ЈМР 991 

890: 

ELSE 
00; 


START$REC з FALSE; 
| ; STATEMENT # 525 
0606720000 MOV STARTREC,OH 
АВОЗ„ОЕР = 0; 
: STATEMENT # 526 
С706 15000000 MOV АНСЗ, ОН 
END; 
891: 
ТЕ CHAR<>ASCR THEN GOTO ERROR; 
> STATEMENT # 528 


823Е560000 СМР CHAR,ODH 
7403 JZ $+5H 
293СЕ4 ЈМР ERROR 
CALL SIO$CRLF; 
; STATEMENT # 530 
E8DAF6 CALL SIOCRLF 


/% LEADING NULLS %/ 
STATEMENT # 531 


DO I=1 TO 60; 


C606689001 MOV ЕСЕН 
0154: 
30355890035 СМР 1,368 


РАСЕ 


48 





PL/M-86 COMPILER SDX86 SERTAL MONITOR 


2007 7700 ЈА 9155 
532 3 CALL 510%00Т%СНАНВ(0); 
; STATEMENT # 532 
0009 8000 MOV AL,OH 
008 50 PUSH AX к 1 
900С E810F5 CALL STOOUTCHAR 
933 3 END; 
| ; STATEMENT # 533 
ЈООЕ 8906630901 ADD I,1H 
ODEY БЕС JNZ 9154 
3155: 
534 2 CALL SLOSCRUF: 
; STATEMENT # 534 
00Е6 ES8BEF6 CALL STOCRLF 
535 2 те М00533086 THEN 
> STATEMENT й 535 
9059 А07300 MOV АС, МООЕЗОВБ 
ODEC 0008 АСА AL ,1 
ODEE 734E JNB 893 
535 2 ро; 
537 3 ТЕ 5ТАНТФНЕС THEN 
; STATEMENT # 537 
00983 407290 MOV AL,STARTREC 
0023 0003 RCR AL, 1 
0025 7328 JNB 834 
538 3 00; 
533 ü CALL STOSOUT$SHEADER(04¥,0,03); /# START ADDRESS RECORD #/ 
; STATEMENT # 539 
ODF? 89008 МОМ AL,4H 
ODF9 50 PUSH AX 8541 
ОБРА 830000 MOV АХ, ОН 
ODFD 50 PUSH AX . 2 
00ЕЕ 8903 MOV AL, ЗН 
0209 50 PUSH AX . 3 
0Е21 888155 CALL 51900ТНЕАРЕН 
549 u CALL SI9$OUT$wWORD(ARG3.,SEG); 
; STATEMENT # 510 
ОБОЦ ҒЕЗ62000 PUSH ARG3+2H ; 1 
9508 285525 CALL STIOUTWORD 
541 u CALL SIO$OUT$WORD(ARG3.0FS); 
; STATEMENT # 541 
ОБОВ ҒЕЗ61%00 PUSH ARG3 ; 1 
ОЕОЕ ЕВЧЕЕ5 CALL STOOUTWORD 
542 4 CALL STO$OUT$BYTE( CHECK$SUM); 
“ STATEMENT й 542 
2812 22356790 PUSH CHECKSUM; 1 
0Е16 581755 CALL 5. sOUTBITE 
543 4 CALL STI$SCRLE:; 
| ; STATEMENT 9 543 
0Е19 ЕЗӘВЕ5 CALL лежат. 
544 u \493,. 2202 = 0; 
2 ЗТАТЯМЕЧТ й 544 
9817 $796 1209099) ЧОУ ат. ЗН 
5 45 Ц 285; 


394: 
545 3 САБЫ S1299UT7%$4dSADSR 02,09,02); 75 EXTENDED 1п08035 ASCORD "7 


PL/M-36 COMPILER 


0Е22 8002 MOV AL,2H 
0Е24 50 PUSH AX ‚1 
ОБ25 890000 MOV Ct, ОН 
0Е28 51 PUSH Cx ка 
0229 50 PUSH AX . 3 
ОЕ2А Е888Е5 CALL STOOUTHEADER 
547 CALL STOSOUT$WORD(ARG1.SEG); 
; STATEMENT # 547 
0Е20 FF361C00 PUSH ARG1+2H ; 1 
0Е31 E82CFS CALL STOOUTWORD 
548 CALL 510300Т5ВҮТЕ(СНЕСКУ50М), 
; STATEMENT Е 548 
0Е34 FF366700 PUSH CHECKSUM; 1 
0Е33  ЕЗЕЗЕЧ CALL STOOUTBYTE 
549 3 CALL SIO$CRLF; 
; STATEMENT Е 549 
0Е38 E869F6 CALL STOCRLF 
550 3 END; 
893: 
551 2 LEN = STANDARD$LEN; /% DATA RECORD h/ 
; STATEMENT # 551 
ОЕЗЕ С7065С001000 MOV LEN, 10H 
552 2 LOOP: INDEX = ЕМОЗОЕЕ ~ АНС1.ОРЁР, 
; STATEMENT # 552 
LOOP: 
0Е44 А11800 MOV АХ, ENDOFF 
2ЕШ7 28061А00 SUB AX, АВС 
ОЕЧВ АЗ5ЕОО MOV INDEX, AX 
553 2 ТЕ INDEX<STANDARD$LEN THEN LEN = INDEX + 1; 
; STATEMENT # 553 
ОБЧЕ 83F810 СМР АХ, ТОН 
2651 7309 JNB 895 
; STATEMENT # 554 
0Е53 A15E00 MOV AX, INDEX 
0256 83C001 ADD AX,1H 
ОБ59 A35C00 MOV LEN,AX 
895: 
555 2 CALL STOSOUTS$SHEADER(LEN,ARG1.0OFF,00); 
; STATEMENT # 555 
ОБ5С FF365C00 PUSH LEN > 4 
0Е60 FF361A00 PUSH ARG1 х 2 
0Е64 8000 MOV АБ, ОН 
0556 50 РУЗН АХ . 3 
0Е67 ES4BFS САС. SIQOUTHEADER 
556 2 DO ї=1 TO СЕН; 
; STATEMENT # 555 
0Е6А  С506680001 MOV Ty ТИ 
8156: 
OE6F 406800 MOV AL, I 
0Е72 B400 MOV АН, ОН 
OE74 38065000 СМР AX,LEN 
0673 7715 JA 2157 
557 3 CALL ЗТОЗОПТВУТ Е ( МЕМОНУЗАНС 1); 


ОЕТА 


SDK86 SERIAL MONITOR 


СЧТЕТАОО LES 


; STATEMENT 6 546 


; STATEMENT # 5 
BX,MEMORYARGIPTR 


л 
З 





РАСЕ 


50 


Р,/М-86 COMPILER 


ОЕТЕ 
0Е81 


ОЕЗЦ 


ОЕЗ9 
ОЕВЕ 


599 2 


0Е90 
OE94 
501 2 


0897 


0Е9А 
0Е90 
ОЕАО 
ОЁАЧ 


564 2 


ОБАб 
OEA8 
OEA9 
OEAD 
OEAF 
ОЕВО 


ОЕВЗ 
ОЕВ? 
566 2 


ОЕВА 
567 2 


ОЕВО 


0ЕС2 
0ЕС7 
568 3 


0ЕС9 

0ЕСВ 

ОЕСС 
569 3 


ОЕСЕ 
OEDY 


570 2 


SDK86 SERIAL MONITOR 


26FF 37 
ЕЗАСЕЦ 


РОЗН ES:MEMORYARG1( BX] 
CALI; SIOOUTBYTE 
ARG1.OFF = АВСІ.ОЄЄ + 1; 
; STATEMENT 


83061A0001 ADD ARG1,1H 
END; 
; STATEMENT 
3006680001 ADD I, 1H 
75DF JNZ 8156 
8157: 


CALL SIO$OUT$BYTE(CHECK$SUM); 

; STATEMENT 
CHECKSUM; 1 
SIOOUTBYTE 


FF 366700 PUSH 

E899F4 CALL 
CALL 5104СБВЇР, 

; STATEMENT 


E80DF6 CALL STOCRLF 
ТЕ END$OFF<>ARG1.OFF-1 THEN GOTO LOOP; 
; STATEMENT 
A11A00 MOV АХ, АВС 1 
ВЗЕВО 1 508 АХ, 1H 
39061800 СМР ENDOFF, AX 
7996 JNZ LOOP 


CALL SIO$OUT$HEADER(00,ARG3.0FF,01); 
; STATEMENT 


В000 моу АС, ОН 

50 PUSH AX ; 1 
FF361E00 PUSH ARG3 ; 2 
8001 MOV AL, 1H 

50 PUSH AX ; 
E302F5 CALL SIOOUTHEADER 


CALL ЗТОЗОПТЗВУТЕ ( CHECK$SUM) ; 

; STATEMENT 
CHECKSUM; 1 
ЗТООЦТВУТЕ 


#е366700 PUSH 

Е?758Ң4 CALL 
CALL SITOSCRLF; 

; STATEMENT 


ЕЗЕАҒ5 CALL 
00 1-1 TO 60; 


STICRLE 


; STATEMENT 


C606680001 MOV Ly Va 
8158: 
803Е68003С СМР I, 3CH 
7790 ЈА 4159 
CALL SLOSOUT$CHAR(0O); 
; STATEMENT 
8000 MOV АГ, ОН 
50 PUSH AX . 1 
E820F4 CALL ЗТООПТСНАВ 
ЕНО; 
; ЗТАТЕМЕНТ 
800668000 1 АОО 1,124 
75ЕС JNZ 8158 
8159: 


END; 


# 558 


# 559 


# 560 


# 561 


# 562 


/% EOF RECORD #/ 
Е 564 


/% TRAILING NULLS #/ 


Е 56? 


# 568 


Е 569 


PL/M-36 COMPILER 50К85 SERIAL MONITOR PAGE 52 
; STATEMENT # 570 
0506 50 POP BP 
0Ер7 СЗ RET А 
г STOWRITE ANDP 
571 ! ЗТОЗВЕАО: 
; STATEMENT # 577 і 
/8 [MPLEMENTS THE READ PAPER ТАРЕ COMMAND. %/ 
SIJREAD PROC МЕАН 
0Е08 55 РЈ5Н ВР 
2Е09 ЗВЕС MOV ЗР,5Р 
PROCEDURE; 
572 2 DECLARE BIAS WORD, (REC$TYPE,LEN,I,T) BYTE, OFFSET WORD; 
573 2 BIAS = 9; /а DEFAULT BIAS #/ i 
; STATEMENT # 573 \ 
0208  с70660000000 MOV ЗІАЗ,ОН # 
574 2 ARG1.SEG з 0; /9 DEFAULT CS FOR 3080 FORMAT FILE #/ | 
; STATEMENT # 574 
ОЕЕ1 С7061С000000 MOV ARG1+2H,0H 
575 2 CALL SIO$SCAN$BLANK; 
; STATEMENT # 575 
ОБЕ? ЕВЕЦЕ5 CALL STOSCANBLANK 
575 2 IF CHAR<>ASCR THEN BIAS = 513308 Т3чО8НО, 
; STATEMENT # 576 
ОБЕА 303Е660000 CMP СНАВ, Ора 
ОЁЕР 7406 17 897 
; STATEMENT # 577 
ОБР) E8FCFS САБЫ STOGETWORD 
ОБЕЦ А35000 MOV 4145,АХ | 2 
097: ! 
573 2 ТЕ CHAR<>ASCR THEN 5079 ERROR; | 
; STATEMENT # 578 
ОБЕ? 803Е660000 CMP СНАВ, ООН 
QEFC 7403. 1% 5454 
ОБЕРЕ £E905F3 JMP ERROR 
580 2 CALL STO$CRLF; 
; STATEMENT 4 580 
OFO1 ЕЗАЗЕ5 CALL SIOCRLF 
581 2 LOOP: 
; STATEMENT # 581 
LOOP: 
OFO4 E87BF7 CALL ЗТОЯБАОСНАЯ 
0207 3СЗА СМР AL, ЗАН 
0209 75Ғ9 JNZ СООР 
DO WHILE SIO$READ$CHAR<>':';END; š 
583 2 CHECK$SUM = 0; 
; STATEMENT # 583 
OFOB C606670000 MOV CHECKSUM,OH 
584 2 LEN = SIO$READ$BYTE; А 
; STATEMENT # 584 
OF10  ЕЗВАЄТ CALL SIOREADBYTE 
OF 13 427500 MOV LEN,AL 
535 2 OFFSET = SIO$READ$WORD; 
; STATEMENT # 585 
OF 15 E8DFF7 CALL SIOREAOWORD 
0Р19 А36200 MOV OF FSET,AX 
586 2 ARG1.OFF = OFFSET + BIAS; 


PL/M-86 COMPILER 


597 


588 


589 
590 


591 


594 


598 


299 


50480 SERIAL MONITOR 


; STATEMENT # 585 
A16200 MOV AX,OF FSET 
03066000 ADD AX, BIAS 
A31A00 MOV ARG1,AX 
REC$TYPE = SIO$READSBYTE; 
‚ STATEMENT # 587 
ЕВАЦЕ? CALL SIOREADBYTE 
A27400 MOV RECTYPE,AL 
IF REC$TYPE=03 THEN /* START ADDR ТУРС #/ 
: STATEMENT # 588 
80 3E740003 CMP RECTYPE, 3H 
750C JNZ 999 
DO; 
CS = SIO$READ$WORD; 
$ STATEMENT # 592 
E8C2F7 CALL STOREADWORD 
A34000 MOV REGSAV+10H, АХ 
ТР = SLO$READ$WORD; 
: STATEMENT # 591 
ЕЗВСЕ? CALL 51385АОМОНО 
A34800 MOV REGSAV+18H, АХ 
END; 
899: 
ТЕ ВЕСЗТУРЕ=02 THEN /% EXTENDED ADDR TYPE #/ 
; STATEMENT 4 593 
803E740002 CMP RECTYPE, 2H 
7506 JNZ 2109 
ARG1.SEG = SIO$READ$WORD; 
; STATEMENT # 594 
E8AFF7 CALL SITOREADWORD 
АЗІСОО МОУ ARG1+2H,AX 
0100: 
ТЕ ВЕСЗТУРЕ = 01 THEN /* EOF %/ 
STATEMENT # 595 
8235740001 СМР RECTYPE, 1H 
7500 JNZ 0101 
IF OFFSET <> 0 THEN IP = OFFSET; 
; STATEMENT # 596 
833Е620000 СМР ОЕЕЗЕТ , ОН 
7406 JZ 8101 
; STATEMENT 4 537 
А15200 MOV АХ, ОРЕЗЕТ 
A34800 MOV REGSAV+18H,AX 
2101: 
ТЕ REC$TYPE=00 THEN /а DATA ТУРЕ ?/ 
; STATEMENT # 593 
823E740000 CAP КЕСТҮРЕ, ОН 
93:7 JNZ 9103 
DO 141 ТО БЕН: 
; STATSMENT # 599 
C605760001 MOV Г, 1Н 
2162: 
407520 MOV 41,1 
34067509 САР ВЫ РОВ 
7729 JA 4193 


Т, МЕМОВУЗАЯС 1 


х ST2$RSADSBYUS 
STATS Те и 


. 
, 


«І 
Па 


PL/M-86 COMPILER 


601 


603 


604 


605 


606 


608 


0275 
0278 
ОР7В 
ОР7Р 


0Е82 
0Е86 
0289 
OF8D 
0F8F 


0F92 


0297 
02960 


ОР9Е 
ОРАТ 


ОРАЦ 
ОРА 
ОРАВ 


ОЁАЕ 
OFB3 
OFBS 
0ЕВ7 
ОЕВ8 
ОЕВ9 
ОЕВЕ 
ОРСО 
0ЕС2 
ОРСЗ 
ОРСЧ 
0206 
ОРСВ 
ОРСА 


OFCD 
ОЕСЕ 
OFDO 


OFD3 
0205 
ОЕО6 


0ЕРр9 


SDK86 SERIAL MONITOR 


ES55F7 CALL STIREADBYTE 

A27700 MOV T,AL 

С41Е1А00 LES BX,MEMORYARGIPTR 
268807 MOV ES:MEMORYARG1(BX],AL 


IF MEMORY$ARG1<>T THEN GOTO ERROR; 
; STATEMENT # 501 


СЦ1ЕТАОО LES BX,MEMORYARGIPTR 
268А07 MOV АС , 53 : МЕМОВУАНС 1 BX] 
33067700 СМР AL,T 

7403 Ј2 3558 

£974F2 JMP ERROR 


АЯС1,О0ЁР = ARG1.OFF + 1; 
; STATEMENT # 603 


8306140001 ADD АЯС1,1Н 
END; 

; STATEMENT # 504 

8006760001 ADD ТЕТЯ 

75СЕ JNZ 9162 

8103: 
T = SIO$READ$BYTE; /% PETCH CHECKSUM %/ 

; STATEMENT # 695 

Е82СЕ7 CALL SIOREADBYTE 

A27700 MOV T, AL 


ТЕ CHECK$SUM<>0 THEN GOTO ERROR; 
; STATEMENT # 606 


823£670000 CMP CHECKSUM, ОН 
7403 97 $+5H 
E958F2 JMP ERROR 


IF REC$TYPE<>01 AND LEN<>9 THEN GOTO LOOP; 
; STATEMENT # 003 


8038780001 СМР АЕСТҮРЕ,1Н 
BOFF MOV AL,OFFH 
1501 JNZ $+3H 

40 INC AX 

50 PUSH AX 21 
823Е750000 СМР LEN,OH 

BOFF MOV AL,OFFH 
7501 JNZ $+3H 

40 INC AX 

59 РОР CX 4-1 
2201 АНО АБ, CL 

0008 RCR AL, 1 

7303 JNB $+5H 

Е93ТЕҒ ЈМР LOOP 


CALL ЗТОЗОЏТЗСНАА(О); /% DELAY FOR LAST CR, LF SENT %/ 


; STATEMENT # 610 


8000 MOV АЫ, ОН 
50 PUSH AX 21 
Е81СРЗ CALL STOOUTCHAR 
CALL ФТОЗОЏТЗСНАА(О); /% BY INTELLEC */ 
; STATEMENT # 611 
8009 MOV AL,OH 
50 PUSH AX ; 1 
5816Ғ3 CALL | SIQOUTCHAR 
END; 
; STATEMENT # 612 
5D POP BP 


PAGE 


54 


PL/M-86 COMPILER 


613 


614 


615 


616 


617 


618 


619 


620 


OFDA 


00А8 
0049 
OOAE 
0081 
0083 
0088 
0089 


00ВА 
008D 
ООВЕ 


00C0 
00C2 


00C3 
00C5 


00C6 


ООСВ 
0000 


00D2 
00D6 
00D8 
00DC 
OODF 


00Е0 
00Е5 


00Е7 
ООЕА 


50К86 SERIAL MONITOR 


C3 RET 
STOREAD ENDP 


/9544808060(239088088288808899404080848 аа 080 6 0: 208 000 


8 COMMAND DISPATCH MAIN PROGRAM LOOP ы 
озоесовенововозевевововеневовевонаонававев / 


# 613 


Е 614 


Е 615 


Е 616 


# 617 


# 618 


# 619 


DISABLE; 
; STATEMENT 
FA СЕТ 
2E8E16A400 MOV 55,С5:885ТАСКФЕНАМЕ 
BC4200 MOV SP, @@STACK$OFFSET 
ВВЕС MOV ВР,5Р 
2E8E1EA609 MOV DS,CS: @@DATA$FRAME 
FB 8ТІ 
ҒА CLI 
OUTPUT(KB$STAT$PORT) = KB$INIT$MODE; 
; STATEMENT 
BAEAFF MOV ОХ, ОЕЕЕАН 
8000 MOV AL,OH 
EE OUT DX ; 
OUTPUT(KB$STAT$PORT) = KB$INIT$SCAN; 
; STATEMENT 
8039 MOV AL,39H 
EE OUT DX 
OUTPUT(KB$STAT$PORT) = 90H; /% OUTPUT "8086" 
; STATEMENT 
8090 MOV AL,90H 
EE OUT DX 
DO I=0 TO 7; 
; STATEMENT 
С606680000 MOV 1,0Н 
0164: 
893Е68 0007 СМР I,7H 
7715 ЧА 0165 
OUTPUT(KB$DATA$PORT) = KB$SIGNON(L); 
; STATEMENT 
8A1E6800 MOV BL,I 
B700 MOV BH,OH 
2ЕВАЦТАВ MOV AL,CS:KBSIGNON[ BX] 
ВАЕВЕЕ MOV ОХ, ОЕЕЕВН 
ЕЕ OUT DX 
END; 
; STATEMENT 
8006680001 ADD I,1H 
75E4 JNZ 8164 
0165: 


/* THIS STRANGE SEQUENCE OF CODE IS USED ТО GUARANTEE CORRECT USART 
INITIALIZATION AFTER EITHER: 1) HARDWARE RESET (EXPECTING MODE) 


2) SOFTWARE RESTART (EXPECTING COMMAND). 


OUTPUT(SIO$STAT$PORT) 


ВАЕФЕЕ MOV 


SI0$8251$RESET; 
; STATEMENT 


DX,OFFF2H 


8065 MOV AL,65H 


# / 


# 620 


SIGNON BACKWARDS */ 


PAGE 


29 


Р,/М-86 COMPILER SDK86 SERIAL MONITOR PAGE 55 


OOEC EE OUT DX 
621 1 CALL STO$8251$SETTLING$DELAY; 
; STATEMENT # 621 
00Ер E8E902 CALL STO8251SETTLINGDELAY 
622 1 ОЏТРОТ( 5103 5ТАТЗРОНТ) = 25H; 
; ЗТАТЕМЕНТ # 622 
OOFO BAF2FF MOV ОХ, ОРРР2Н 
ООРЗ 8025 MO V AL,25H 
OOFS EE OUT DX 
623 1 CALL STO$8251$SETTLINGS$DELAY; 
; STATEMENT # 623 
00Ғ6 Е8ЕО02 CALL STO8251SETTLINGDELAY 
624 1 OUTPUT(SIOSSTATSPORT) = SIO$8251$RESET; 
; STATEMENT # 624 
ООР9 ЗАР2?Р MOV DX,OFFF2H 
ООРС 8065 MOV AL,65H 
00РЕ ЕЕ OUT DX 
625 1 CALL SIO$8251$SETTLINGS$DELAY; 
; STATEMENT # 625 
ООРЕ Е80702 CALL SIC8251SETTLINGDELAY 
626 1 OUTPUT(SIO$STATS$PORT) з STO$8251$MODE; 
; STATEMENT # 626 
0102 BAF2FF MOV DX,OFFF2H 
0105  ВОСЕ MOV AL,OCFH 
0107 EE OUT DX 
627 1 CALL STO$8251$SETTLINGS$DELAY; 
; STATEMENT # 627 
0108 E8CEO2 CALL SIO8251SETTLINGDELAY 
628 1 OUTPUT(SIO$STATS$PORT) = 3103825 13СМНО; 
; STATEMENT # 628 
0108 BAF2FF MOV DX,OFFF2H 
0102 8025 MOV AL,25H 
0110 ЕЕ OUT DX 
629 1 CALL 5103825 143ЕТТ! ТНСЗОЕГАТ; 
; ЗТАТЕМЕНТ # 529 
0111 Е8С502 CALL STO8S251SETTLINGDELAY 
6 30 1 CALL STO$SOUTSSTRING( @SIO$SIGNON) ; 
; STATEMENT # 630 
0118 2Е80062700 LEA AX,CS:SIOSIGNON 
0119 OE PUSH cs ; 1 
011А 50 PUSH AX ; 2 
0118 Е86402 CALL STOOUTSTRING 
/% INITIALIZE USER'S REGISTERS %/ 
631 1 С3,33,03,Е3,РЬ,ТР з 0; 
; STATEMENT # 631 
011Е 8В880000 MOV АХ, ОН 
0121 A34000 MOV REGSAV+10H,AX 
0124 A3Z4400 MOV REGSAV+14H,AX 
0127 A318200 MOV REGSAV+12H,AX 
012А A34600 MOV REGSAV+16H,AX 
0120 АЗЧАОО MOV REGSAV+1AH,AX 
0130 А34800 MOV REGSAV+18H,AX 
632 1 SP = USER$INITS$SP; 


; STATEMENT # 532 


/9 INITIALIZE INTERRUPT VECTORS %/ 


PL/M-86 COMPILER 


633 


634 


6 35 


636 


637 


638 


639 


0133 


0139 
0130 
ОТЗЕ 
ОТЗЕ 
0142 
0143 


0146 
ОТЧА 
0148 
0146 
014Е 
0150 


0153 
0157 
0158 
0159 
015C 
015D 


0160 


0165 
0167 


016A 
016C 


016Е 
0172 
0174 


0179 


0170 
О17Е 
017F 


0182 


SDK86 SERIAL MONITOR PAGE 


C70638000001 MOV REGSAV+8H,100H 
CALL INITS$INT$VECTOR( @INT$VECTOR(1),.INTERRUPTI$SENTRY); 
; STATEMENT # 633 
80060400 LEA AX, INTVECTOR+4H 
ТЕ PUSH DS ; 1 
50 PUSH AX ; 2 
B8DF07 MOV AX, ОРЕЗЕТ ( INTERRUPTIENTRY) 
50 PUSH AX ; З 
882807 CALL INITINTVECTOR 
CALL INIT$INT$VECTOR( @INT$VECTOR(2),.INTERRUPT3$ENTRY); 
; STATEMENT # 634 
80060820 LEA AX, INTVECTOR+8H 
1E PUSH DS ; 1 
50 PUSH AX ; 2 
885108 MOV AX, OF FSET( INTERRUPT3ENTRY) 
50 PUSH AX ; 3 
Е81Е07 CALL INITINTVECTOR 
CALL INIT$INT$VECTOR( @INT$VECTOR(3),.INTERRUPT3$ENTRY); 
; STATEMENT # 635 
80060С00 LEA AX, INTVECTOR+0CH 
ТЕ PUSH DS ; 1 
50 PUSH AX. ; 2 
885108 MOV AX, OFFSET( INTERRUPT3ENTRY) 
50 PUSH AX . З 
Е81107 CALL INITINTVECTOR 
BRKI$FLAG = FALSE; 
; STATEMENT # 636 
C606640000 MOV BRK1FLAG,OH 
MONITOR$STACKPTR = STACKPTR; 
; STATEMENT # 637 
89E0 MOV AX,SP 
A31400 MOV MONITORSTACKPTR, AX 
MONITOR$STACKBASE = STACKBASE; 
; STATEMENT 4 538 
8CDO MOV AX,SS 
A31600 MOV MONITORSTACKBASE, AX 
NEXT$COMMAND: 
; STATEMENT # 539 
/* THIS IS THE PERPETUAL COMMAND LOOP WHICH DISPATCHES TO EACH 
COMMAND WHICH IS A SEPARATED PROCEDURE. %/ 
NEXTCOMMAND: 
BC4200 MOV SP,@@STACK$OFFSET 
8BEC MOV BP,SP 
2E8E1E£A600 MOV 0$ , СЗ: @@DATA$FRAME 
CALL SIO$CRLF; 
E82B03 CALL SIOCRLF 
CALL SIO$OUT$CHAR(O); 
; STATEMENT # 610 
В000 MOV АБ, ОН 
50 PUSH AX ; 1 
E86D01 CALL SIOOUTCHAR 
CALL SIO$OUT$CHAR('.'); 
; STATEMENT # 641 
BO2E MOV AL,2EH 


57 


PL/M-86 COMPILER 


SDK86 SERIAL MONITOR 


0188 sO PUSH AX ; 1 
0185 £86701 CALL SIOOUTCHAR 
642 1 CALL SIO$GETS$CHAR; 
; STATEMENT # 
0188 £88401 CALL ЗІОСЕТСНАЯ 
643 1 DO 120 ТО LAST(SIO$CMND); 
; STATEMENT 4 
0188 С606680000 MOV I,0H 
@166: 
0190 803Е680009 СМР 1,9Н 
0195 776Е ЈА ERROR 
644 2 ТЕ CHAR=SIO$CMND(I) THEN GOTO DISPATCH; 
; STATEMENT # 
0197 A06600 MOV AL, CHAR 
019A 3А126800 MOV BL, I 
019E B700 MOV BH, ОН 
01А0 2ЕЗАЧТЦЕ CMP AL,CS:SIOCMND( BX] 
0144 7409 47 DISPATCH 
646 2 END; 
; STATEMENT # 
0146 8006680001 ADD 1,1Н 
ОТАВ 75Е3 4472 2166 
647 1 GOTO ERROR; 
; STATEMENT # 
ОЛАр 2857 ЈМР ERROR 
638 1 DISPATCH: 
: STATEMENT # 
DISPATCH: 
LAST$COMMAND = Т; 
ОТАЕ 406800 MOV AL, I 
0182 A26A00 MOV LASTCOMMAND, AL 
649 1 DO CASE I; 
; STATEMENT # 
0185 8500 МОУ АН,ОН 
0187 8963 MOV BX,AX 
0189 D1E3 SLL BX, 1 
0188 2EFFAT7F201 JMP CS:@168( ВХ] 
650 2 CALL SIO$EXAM$MEM; 
; STATEMENT 8 
@109: 
01СО £86307 CALL SIOEXAMMEM 
ОТСЗ ЕВАА JMP NEXTCOMMAND 
651 2 CALL ЗТОЗЕХАМЗ ВЕС; 
; ЗТАТЕМЕНТ і 
8110: 
0105 £83£08 CALL SIOEXAMREG 
0108 ЕВА5 JMP NEXTCOMMAND 
652 2 CALL SIO$GO; 
; STATEMENT # 
8111: 
ОТСА Е8С506 CALL 51060 
01CD ЕВАО ЧМР NEXTCOMMAND 
653 2 CALL SIO$SINGLESSTEP; 
; STATEMENT # 
9112: 
ОТСЕ Е82р07 CELL SIOSINGLESTEP 
0102 ЕВ9В JMP NEXTCOMMAND 


642 


643 


644 


646 


647 


648 


649 


652 


653 


PAGE 


58 


PL/M-86 COMPILER SDK86 SERIAL MONITOR 


655 


057 


661 
662 


1 


1 


CALL SIO$MOVE; 
; STATEMENT # 654 
@113: 
0104 E87E09 CALL 510МОҮЕ 
0107  ЕВ96 ЈМР МЕХТСОММАНО 
CALL SIO$DISPLAY; 
; STATEMENT # 655 
0114: 
0109 ЕЗОАОА CALL STODISPLAY 
910С 2891 ЈМР NEXTCOMMAND 
CALL SIO$INPUT; 
; STATEMENT # 656 
0115: 
010Е  Е8С5ОА CALL STOINPUT 
ОТЕ 1 ЕВВС ЈМР NEXTCOMMAND 
CALL 510300ТРОТ,: 
: STATEMENT # 557 
8116: 
0123 280008 CALL STOOUTPUT 
0126 ЕВ87 JMP NEXTCOMMAND 
CALL SIO$READ; 
| ; STATEMENT # 558 
6117: 
01Е8 E8EDOC CALL STOREAD 
012: 
О1ЕВ 882 ЈМР NEXTCOMMAND 
CALL ЗТОЗИНТТЕ; 
; STATEMENT # 559 


0118: 
91Е0  Е85708 CALL SIOWRITE 
ОТЕО ЕВЕ9 JMP @12 

END; 
; STATEMENT 4 560 

8168: 
0192 C001 DW 2109” 
01Ғ% C501 DW @110 
0126 САО1 ри 8111 
01Е8 СЕ01 ры 8112 
O1FA 0401 DW 0113 
01FC 0991 ри 9114 
ОТЕБ DEDI ри 3115 
0200 2301 ри 0116 
0202 Е801 ри 0117 
0204 EDO! ри 2118 


СОТО NEXT$COMMAND; 


ERROR: 
; STATEMENT # 562 
/% THIS ROUTINE HANDLES ALL ERRORS DETECTED BY THE MONITOR AND 
WILL OUTPUT THE ERROR PROMPT TO THE OUTPUT PORT. #/ 


ERROR: 
0206 BC4%200 MOV SP,@@STACK$OFFSET 
0209 ЗВЕС MOV BP,SP 
0208 258Е1БА600 MOV DS,CS: @@DATA$FRAME 
0219 8023 MOV AL,23H 


0212 50 PUSH AX с 1 


PAGE 


59 


21/м-86 COMPILER 


565 
666 


667 


568 


0213 


0216 


0218 
0218 
0210 
9222 
0225 
0227 


0229 
0226 
0230 


0233 


0238 
0238 
023Е 
023Ғ 
0242 
0245 
0247 
0238 
0240 
0248 
0251 
0252 
0253 
0256 
0258 
025А 
025Е 
025Ғ 
0261 
0265 
0266 
0268 
026А 
026C 
026D 
026Е 
0270 


50К86 SERIAL MONITOR PAGE 
580900 CALL 51000ТСНАВ 
CALL SIO$OUT$CHAR('#'); 
СОТО NEXT$COMMAND; 
; ЗТАТЕМЕНТ # 663 
2803 ЈМР 812 
AFTERSINTERRUPT: 
; STATEMENT # 664 
/9 THIS ROUTINE IS CALLED AFTER AN INTERRUPT TO DISPLAY THE CS: IP 
AND RESTORE THE BREAKPOINTED INSTRUCTION. #/ 
AFTERINTERRUPT: 
BC4200 MOV 5Р,905ТАСКФОРЕЗЕТ 
ВВЕС мом ВР, ЗР 
2Е8Е1ЕА600 MOV DS,CS: 3@DATASPRAME 
A06400 MOV AL, BRKIFLAG 
рор8 АСЯ 41,41 
7354 JNB 9119 
ТЕ BRK1$FLAG THEN 
DO; 
MEMORYS$BRK1 = BRKI$SAVE; 
; STATEMENT # 566 
A06530 MOV AL,BRKISAVE 
C4182200 LES ВХ, МЕМОВУВЕК 1РТА 
268807 MOV ES: МЕМОЯТВЕК 1 ( ВХ), АГ. 
BRK1$FLAG = FALSE; 
; STATEMENT # 667 
С6066%0000 MOV ВЯК 1ЕТ АС , ОН 
ТР ((ІР-1) AND OOOFH)=(BRK1.0FF АМО ОООРН) AND 
; STATEMENT 9 668 
А14809 MOV AX, ВЕСЗАУ + 1 8Н 
ВЗЕВО 1 SUB AX, 1H 
50 PUSH AX ; 1 
250F00 AND АХ,ОЕН 
ВВОЕ2200 MOV CX, ВЕК 1 
51 PUSH cx ; 2 
81£10F00 AND СХ,ОРН 
3ВС1 СМР АХ, Cz 
BOFF MOV А.,ОРЕН 
7401 42 $+3Н 
40 INC AX 
SA POP DX ; 2 
8756ҒЕ XCHG 0Х,ГВ8Р1-2Н: 1 
8104 MOV CL,4H 
ОЗЕА SHR ох, et 
03164000 ADD DX,REGSAV+10H 
58 POP BX : 1 
ОЗЕВ SHR at CL 
031Е2400 ADD BX, ВЯК 1+2 
50 PUSH AX ЭР 
3803 СМР рх. вх 
ВОЕЕ MOV AL,OFFH 
7401 32 $+3H 
40 INC AX 
59 POP CX ; 1 
2201 AND AL; ÈL 
0003 RCR АС, 1 


60 


PL/M-86 COMPILER 


0272 
669 2 
679 3 
0274 
671 | 3 
0279 
027Е 
027Е 
0280 
672 3 
673 2 
674 1 
0283 
9285 
0286 
675 1 
0289 
0280 
676 1 
0290 
0292 
0293 
677 1 
0296 
029А 
673 1 
0290 
579 1 


50К86 SERIAL MONITOR 


730F JNB 9119 
(5Н8(1Р-1,3)-051)-(5НЯА(ВКК1.0СЕ,4)-38К1.,511) 
ро; 
ТР з TP - 1; 
: STATEMENT # 572 
832E480001 SUB REGSAV+18H,14H 
CALL SIO$OUTSSTRING( @SIO$BREAK$MSG); 
STATEMENT # 671 


, 
2Е8 0062300 LEA AX,CS:STIBREAKMSG 
ОЕ РЈ5Н cs . 1 
50 PUSH АХ . 2 
ESFFOO CALL STIOUTSTRING 
END; 
END; 
2113: 


CALL SITO$OUT$CHAR('@'); | 
; STATEMENT 8 67Ц 


8040 MOV АС, ЦОН 
50 РУЗН АХ ; 1 
E86500 CALL STOOUTCHAR 


CALL SITO$OUT$WORD(CS); 


Ov 
ч 
мл 


і ; STATEMENT і 
FF 354000 PUSH REGSAV+10H; 1 
E8D000 CALL STIOVTWORD 
CALL SIO$OUTS$CHAR(':'); 
; STATEMENT Е 576 


ВОЗА MOV AL, ЗАН 
59 PUSH AX # 1 
£85909 CALL STOOUTCHAR 


CALL ЗТОЗОИТФИОНО (ТР); 

; STATEMENT # 577 
REGSAV+18H; 1 
ЗТООИТИОКО 


ЕҒЗ68800 PUSH 
E8C300 CALL 
GOTO NEXTECOMMAND; 
; STATEMENT f 573 
Е9СЕҒЕ ЈМР NEXTCOMMAND 


END MONITOR; 79 END OF MODULE %/ 


БОР 


-.. 
ла 


PAGS 





Р /М-86 COMPILER 


50К86 SERIAL MONITOR 


CROSS-REFERENCE LISTING 


DEFN 
664 
169 


11 


11 


10 


10 


10 


51 


572 


15 


ADDR 
0218H 


0000H 


ООТАН 


ООТЕН 


ООЗЕН 


0008H 


0060H 


FHFFF6H 
ЕНЕРЕВН 
РНРРРОН 
РНРРЕ1Н 
РНРЕРЗН 


0000H 


SIZE 


NAME, 


ATTRIBUTES, 


AND REFERENCES 


AFTERINTERRUPT 


ARG 


АНС1 


ARG3 


ASBL 


ASCII 


ASCR 


BIAS 


BLOCK8089 
BLOCKSO89PTR 
BOOT! 

BOOT2 

80073 

BOOTY 


BP 


LABEL 
277 
STRUCTURE BASED( PTR) 
170 171 175 175 
STRUCTURE АТ 
318 351 352 354 304 
432 538 444 449 451 
516 547 552 555 558 
603 
STRUCTURE АТ 
414 424 522 526 540 
LITERALLI 
88 53 125 130 599 
BYTE ARRAY(16) DATA 
53 54 86 87 
LITERALLI 
118 160 191 266 290 
360 387 390 394 415 
518 528 576 578 
LITERALLI 
115 
ВУТЕ PARAMETER AUTOMATIC 
52 53 55 55 
WORD 
573 577 586 


WORD AT INITIAL ABSOLUTE 


809 
454 
562 


541 


298 
431 


POINTER AT INITIAL ABSOLUTE 


BYTE 
WORD 
WORD 
SORD 


LITERALLY 
245 


ARRAY(1) 
ARRAY(1) 
ARRAY(1) 


ARRAY(2) 


DATA 


421 
455 
574 


544 


329 
340 


АТ INITIAL АЗЗОСУТЕ 


AT INITIAL ABSOLUTE 


АТ INTTTAL ABSOLUT= 


423 
457 
585 


564 


334 
473 


430 
511 
594 


348 
495 


Р /М-86 


11 


92 


36 


105 


11 


478 


168 


195 


COMPILER 


0022H 


0064H 


0065H 


OOO4H 


ОООЧН 


0006H 


0004Н 


0066H 


0026H 


0058H 


0004Н 


9053H 


SDK86 SERIAL MONITOR 


BREAKINST 


BRK 1 


BRKIFLAG 


BRKISAVE 


C1 


C2 


CHAR 


CHECKSUM 


COPYRIGHT 


CORRECTION 


cS 


CSIP 


DATUM 


ОБРАЦСТВАЗЕ 


DELAY 


LITERALLY 
293 294 
STRUCTURE AT 
289 668 
BYTE 
296 636 664 
BYTE 
292 666 


BYTE PARAMETER 
93 94 95 


BYTE PARAMETER 


37 42 

BYTE PARAMETER 
106 108 

BYTE PARAMETER 
106 108 

BYTE 


23 24 25 
100 120 125 
162 163 172 
286 290 298 
360 376 378 
431 434 440 
504 509 512 


55 76 218 


BYTE ARRAY(19) 


LITERALLY 
282 


LITERALLY 
188 192 318 
675 


STRUCTURE АТ 
184 185 192 
311 


WORD 
484 488 489 


WORD PARAMETER 
169 170 


WORD 
197 199 200 


667 
AUTOMATIC 

96 
AUTOMATIC 
AUTOMATIC 
AUTOMATIC 
28 29 
130 138 
177 191 
308 319 
387 399 
166 %73 
618 528 
542 548 

DATA 
404 414 
261 262 
AUTOMATIC 


33 
143 
210 
329 
394 
481 
576 


560 


47 
153 
212 
331 
405 
485 
578 


565 


301 


48 
154 
259 
334 
411 
490 
644 


583 


522 


302 


PAGE 


49 
160 
266 
348 
415 
495 


606 


668 


63 


PL/M-86 


648 


652 


12 


157 


16 
16 
16 
16 


12 


34 


358 


COMPILER 


ОТАЕН 


00138 г 


0206Н 


0581H 


ЕНЕРОВН 5 


РНРЕЕОН 16 


РНРРР5Н 1 
РНРРРСН 3 
0008H 1 
0070H 1 
0076H 1 


50К86 SERTAL MONITOR 


DISPATCH 


DOUBLE 


05 


ENDOFF 


ERROR 


25 


EVAL 


"з 


LABEL 
545 


BUILTIN 
95 95 


LITSRALLY 
631 


WORD 
408 409 
515 552 
LABEL 
30 34 
299 309 
406 310 
482 486 
LITERALLY 
531 
LABEL 
147 
LITERALLY 
15 
LITERALLY 
19 90 


421 432 437 
562 


152 164 178 


320 335 340 
412 416 429 


513 517 529 


193 111 118 


РАСЕ 64 


438 449 454 515 


203 267 291 295 
355 375 379 331 
435 439 441 567 
579 532 637 647 


506 525 635 667 


BYTE ARRAY(5) АТ INITIAL ABSOLUTE 


BYTE ARRAY(16) 


AT INITIAL ABSOLUTE 


BYTE ARRAY(1) АТ ТМТТТАС ABSOLUTE 


BYTE ARRAY(4) 


393 312 631 


BYTE PARAMETER AUTOMATIC 


LITERALLY 
254 263 
LITERALLY 
85 87 
BUILTIN 
59 
BYTE 
363 365 
396 398 
BYTE 


599 


366 368 359 
399 


AT INITIAL ABSOLUTE 


389 393 392 394 


Р /М-86 


280 


248 


270 


279 


COMPILER 


0068H 


ООБЕН 


0871Н 


0095Н 


0005Н 


ОТОЕН 


08518 


0004Н 


0000H 


00064 


001BH 


50К86 SERIAL MONITOR 


2 INDEX 


33 INITINTVECTOR 


15 INITINTVECTORCODE 


2 INITINTVECTORCODEPTR 


INPUT 


114 INTERRUPTIENTRY 


57 INTERRUPTZENTRY 


2 INTROUTINEOFFSET 


20 INTVECTOR 


4 INTVECTORPTR 


INWORD 


TP 


КВРрАТАРОНТ 


KBINITMODE 


KBINTITSCAN 


8 KBSIGNON 


KBSTATPORT 


LAST 


BYTE 

67 68 69 70 82 86 87 99 
229 230 240 242 531 556 567 617 
643 644 548 649 


WORD 
Boe 533 359 


PROCEDURE STACK=000EH 
533 934 635 


BYTE ARRAY(15) DATA 
280 


WORD DATA 
281 


BUILTIN 
18 23 28 40 45 47 198 207 


PROCEDURE INTERRUPT(1) STACK=0026H 
633 


PROCEDURE INTERRUPT(3) STACK=0014H 
634 635 


WORD PARAMETER AUTOMATIC 
280 282 


POINTER ARRAY(5) 
633 634 635 


POINTER PARAMETER AUTOMATIC 
280 281 282 


BULLTIN 
470 


LITERALLY 
183 185 309 631 668 679 677 


LITERALLY 
518 


LITSRALLY 
614 


LITERALLY 
515 


BYTE ARRAY(8) SATA 
613 


LITERALLY 
514 515 516 


BUILTIN 


PAGE 


100 
618 


471 


6 5 


PL/M-86 COMPILER 


та 


73 


73 


552 


196 


66 


8445 


484 


581 


11 


11 


11 


11 


ООбАН 


005СН 


0075Н 


00088 


00068 


OBAEB 


OE SSH 


96858 


освен 


0C3BH 


ОСРРН 


ОРОЗН 


0000Н 


ООТАН 


0000H 


ООТЕЧ 





50К86 SERIAL MONITOR 


LASTCOMMAND 


LEN 


LEN 


LENGTH 


LOADADDOR 


LOOP 


LOOP 


LOOP 


LOOP 


LOOP 


LOOP 


LOOP 


LOW 


MAXDELAY 


МЕМОЯТАЯС 1 


MEMORYARGIPTR 


MEMORYARG3 


MEMORYARG3PTR 


86 643 
BYTE 

255 648 
WORD 


551 554 555 555 


BYTE 
584 599 608 


BYTE PARAMETER AUTOMATIC 
78 Т? 


WORD PARAMETER AUTOMATIC 
7% 78 


LABEL 
425 


LABEL 
563 


LABEL 
211 


LABEL 
875 


LABEL 
460 


LABEL 
497 


LABEL 
609 


BUILTIN 
60 216 217 383 33% 589 


LITERALLY 
200 


BYTE BASED(MEMORYARGIPTR) 
325 383 344 318 319 453 557 500 


POINTER 
11 324 325 333 339 343 344 418 
448 453 557 600 601 


BYTE ВАЗЕЮ ( МЕМОКТАЯСЗРТЯ \ 
418 319 


POINTER 
11 418 419 


РАЈЕ 3) 


691 


Р /М-86 


11 


11 


11 


11 


11 


11 


11 


501 


639 


11 


11 


11 


11 


11 


169 


COMPILER 


0000H 


0022H 


0000H 


0026H 


0000H 


ООФАН 


0000H 


0073H 


ООАВН 


0016H 


0014Н 


0C31H 


016FH 


00004 


0900Н 


0000Н 


0000Н 


0000H 


0000H 


1 


504 


SDK86 SERIAL MONITOR 


MEMORY BRK1 


MEMORYBRKIPTR 


MEMORYCSIP 


MEMORYCSIPPTR 


MEMORYUSERSTACK 


MEMORYUSERSTACKPTR 


MEMORYWORDARG1 


МОПЕЗОВ6 


MONITOR 


MONITORSTACKBASE 


MONITORSTACKPTR 


NEWLINE 


NEXTCOMMAND 


vere 


ОБЕ 


ОБЕ 


OFF 


OFF 


ОЕЕ 


BYTE BASED(MEMORYBRK1PTR) 
292 293 294 666 
POINTER 
11 292 293 294 666 
BYTE BASED(MEMORYCSIPPTR) 
188 
POINTER 
11 188 
WORD BASED(MEMORYUSERSTACKPTR) 
227 230 242 245 
POINTER 
11 227 230 242 245 
WORD BASED(MEMORYARGIPTR) 
324 338 339 448 
BYTE 
503 506 535 


PROCEDURE STACK=0042H 


WORD 
252 


WORD 
251 


LABEL 


459 


LABEL 


268 


WORD 
185 


WORD 
228 


WORD 
668 


WORD 
424 


WORD 


351 
44g 


562 


WORD 
171 


274 638 


274 537 


661 663 578 


МЕМВЕН ( СЗТР ) 
251 301 310 


MEMBER(USERSTACK) 
231 234 239 241 244 245 249 


МЕМВЕВ (ВАК Т) 


МЕМВЕВ ( АКСЗ) 
526 541 544 564 


MEMBER(ARG1) 
352 354 409 421 423 432 438 
451 454 456 457 5 
586 603 


л 
—+ 
с 


MEMBER( ARG) 
178 176 


PAGE 


ц 
558 





PL/M-36 


280 


272 


134 


478 


463 


168 


65 


274 


14 


236 


43" 


COMPILER 


0000H 


00629 


006BH 


ООБАН 


0056H 


0006H 


00048 


0074H 


0004Н 


0058H 


002ЕН 


ООТЦН 


0030H 


9766H 


JOTEN 


3904Ч 


2 


2 


28 


28 


96 


SDK86 SERIAL MONITOR 


OFF 


OFFSET 


OPER 


OUTPUT 


OUTWORD 


PORT 


PORT 


PTR 


PTR 


RECTYPE 


RECTYPE 


REG 


REGINDEX 


REGORD 


ВЕСЗАУ 


RESTOREEXECUTE 


ASS TIRSEL ЛЕ, 


RESTORE EXECUTECOOE 


WORD MEMBER(VECTOR) 


603 


399 


227 
281 
313 
599 


282 
WORD 
585 586 596 597 
BYTE 
135 157 163 
BUILTIN 
42 196 202 206 489 
620 622 624 626 628 
BUILTIN 
488 
WORD 
180 488 339 
ЧОНО 
465 370 471 
POINTER PARAMETER AUTOMATIC 
169 170 171 175. 175 
POINTER PARAMETER AUTOMATIC 
66 68 69 
BYTE 
587 588 593 595 598 
BYTE PARAMETER AUTOMATIC 
74 79 
ВҮТЕ ARRAY(28) РАТА 
100 108 365 366 398 
WORD 
107 108 145 380 
BYTE ARRAY(11) DATA 
230 242 
WORD ARRAY( 14) 
145 133 184 185 192 
238 239 242 245 254 
302 303 310 31! 312 
404 414 430 511 522 
632 668 570 675 577 
PROCEDURE 5ТАСК:2023Ч 
256 264 39% 313 
BYTE АЗААҮ(22) GATA 
237 
WORD DATA 


230 
262 
353 
591 


234 
301 
392 
531 


ai 


PL/M-35 


358 


11 


11 


280 


169 


81 


7 


17 


9715H 


0002H 


0002H 


0092H 


0002H 


0902H 


0002H 


0002H 


93D9H 


9023H 


О2АОН 


81 


14 


19 


50836 SERIAL MONITOR 


SAVE 


SAVE 


SAVEREGISTERS 


SEG 


SHL 


SHR 


ТО 825 1СМНО 


5190825 10ТАОМ 


5108251М00Е 


3128251ЧЕЗЕ7 


SI08251SETTLINGDELAY 


ЗТОВКЕАКМ5 3 


STOCHARRDY 


246 


WORD 


389 392 


WORD 
139 145 149 154 158 


PROCEDURE STACK=9002H 


293 275 
WORD MEMBER(USERSTACK) 
233 238 246 250 272 
WORD MEMBER(CSIP) 

184 262 299 39 571 
WORD МЕМВЕВ( ВНК 1) 

668 
WORD МЕМВЕВ(АВОЗ) 

540 
WORD МЕМВЕН ( УЗСТОВ ) 
281 
МОВО MEMBER(ARG1) 

547 574 594 
WORD MEMBER( ARG) 

170 175 
BUILTIN 

154 217 224 
BUILTIN 

53 82 568 
LITERALLY 

202 206 528 
LITERALLY 

196 
LITERALLY 

626 
„т АД ШҮ 

520 524 

PROCEDURE З5ТАСКа" 392 
621 523 525 Да? 4 17 
BYTE ARRAY(H) DATA 

671 


PROCEDURE BYTE 


ЭЛ АСК ЈЕ. 


59 


РО/М-86 COMPILER 


22 


427 


237 


168 


44 


133 


284 


92 


462 


402 


62 


54 


02838 


ООЧЕН 


ОЧА?Н 


OBE6H 


0926H 


0А06Н 


O5E4H 


ОЗОЕН 


ОЦЕОН 


0892H 


0416Н 


OCA6H 


0855Н 


0377Н 


0330Н 


60 


192 


224 


229 


65 


33 


244 


109 


27 


64 


48 


SDK86 SERIAL MONITOR 


STOCHECKCONTROLCHAR 
STOCMND 


STOCRLF 


STODATAPORT 
STODISPLAY 
STODSRDY 
STOEXAMMEM 
STOEXAMREG 
STIGETADDR 


ЗТОСЕТСНАЯ 


STOGETWORD 


51000 
ЗІОНЕХ 
STOINPUT 
ЗІОМОУЄ 
STOOUTBLANK 


ЗІЗОЧТВТТЕ 


STACK=0006H 


BYTE ARRAY(10) DATA 


26 38 
PROCEDURE 
39 209 
643 644 
PROCEDURE 
257 276 
468 492 
639 
LITERALLY 
23 28 
PROCEDURE 
655 
LITERALLY 
198 
PROCEDURE 
650 
PROCEDURE 
651 
PROCEDURE 
192 289 
PROCEDURE 
119. 123 
174 190 
472 483 
PROCEDURE 
171 175 
515 57” 
PROCEDURE 
652 
PROCEDURE 
149 154 
PROCEDURE 
656 
PROCEDURE 
654 
PROCEDURE 
182 187 
PROCEDURE 
59 50 


5ТАСК:0010Н 
300 353 362 370 397 (417 
530 534 543 549 561 566 


42 47 


ЗТАСК-0022Н 


5ТАСК-0022Н 
STACK=001CH 
ЗТАСК 290 1ЕН 
318 404. 414 430 511 522 
5ТАСК:0010Н 
126 129 131 142 146 155 
288 328 377 386 407 413 
598 $92 507 510 51% 921 
WORD STACK=0014H 
333 389 408 437 455 480 
ЗТАСК =0026Н 
WORD STACK=0004H 
216 217 


ЗТАСК 200 1СН 


5ТАСК:0022Н 


ЗТАСК-0010Н 
189 322 327 364 385 (145 


ЗТАСК =0012Н 
77 79 188 325 453 471 


РАСЕ 


543 
580 


165 
436 
542 


484 


Р,/М«86 


36 


128 


306 


117 


181 


COMPILER 


O2EFH 


03B5H 


OCE6H 


0382H 


0360H 


_ ОЕрВН 


ОбСОН 


0682H 


ОбЕВН 


O4DEH 


0027Н 


ОВЕЕН 


O4B8H 


0625H 


32 


36 


9 7 


259 


43 


то 


29 


23 


39 


38 


9 3 


50К86 SERIAL MONITOR 


STOOUTCHAR 


STOOUTHEADER 
STOOUTPUT 
STOOUTSTRING 


STOOUTWORD 


STOREAD 
STOREADBYTE 
STOREADCHAR 
STOREADWORD 
STORXRDY 
STOSCANBLANK 
STOSIGNON 
STOSINGLESTEP 


STOSTATPORT 


STOTESTWORDMODE 
STOTXRDY 


ЗТОПРОАТЕТР 


560 565 

5ТАСК-0ООСН 
51 63 69 75 118 115 
366 367 382 38% 398 399 
510 611 640 641 662 574 


5ТАСК-0022Н 
555 551 


5ТАСК-0018Н 
STACK=0014H 


5ТАСК:0018Н 

32% 354 369 383 Yay 444 
547 675 677 

5ТАСК-001АН 

BYTE 5ТАСК-201ОН 

5844 587 600 605 


BYTE STACK=900AH 


581 

WORD STACK=9016H 
591 594 
207 


STACK29014H 
272 


ВҮТЕ ARRAY(23) РАТА 


548 557 
PROCEDURE 
49 23 
326 395 
532 568 
PROCEDURE 
539 546 
PROCEDURE 
857 
PROCEDURE 
630 671 
PROCEDURE 
78 133 
540 541 
PROCEDURE 
658 
PROCEDURE 
223 224 
PROCEDURE 
216 217 
PROCEDURE 
585 590 
LITERALLY 
18 45 
PROCEDURE 
359 403 
630 
PROCEDURE 
653 
LITERALLY 
18 цо 
622 624 
PROCEDURE 
317 42g 
LITERALLY 
40 
PROCEDURE 
258 285 


5ТАСК-2026Н 


45 196 198 202 205 207 
626 628 


5ТАСК-0014Н 
464 479 


ЗТАСК-0022Н 
307 


РАСЕ 


136 
493 
675 


479 


520 


Р /М-86 


84 


105 


98 


501 


512 


428 


222 


219 


COMPILER 


0431H 


0047Ч 


0072H 


ООООН 
0077H 
0071Н 
ООбЕН 
ООбЕН 


0060Н 


50К86 SERIAL МОМІТОЯ 


47 510УАШТОНЕХ 


71 SIOVALIDREG 


47 SIOVALIDREGFIRST 


401 STOWRITE 


ЭР 


55 


SSCOMMAND 


STACKBASE 


ЗТАСКРТЯ 


STANDARDLEN 


STARTADDR 


1 STARTREC 


STEPTRAP 


1 STR 


PAGE 
BYTE STACK=0004H 
BYTE 5ТАСК-0008Н 
BYTE STACK=0002H 


STACK 20026H 


393 312 


BYTE BASED( PTR! ARRAY(1) 


PROCEDURE 
151 153 
PROCEDURE 
143 378 
PROCEDURE 
140 378 
PROCEDURE 
659 
LITERALLY 
239 
LITERALLY 
238 631 
LITERALLY 
255 
BUILTIN 
250 252 
BUILTIN 
249 251 
LITERALLY 
551 553 
LITERALLI 
13 11 
BYTE 
520 525 
LITERALLY 
254 263 
68 69 
BYTE 
600 601 
BYTE 
457 458 
BYTE 
376 378 
BYTE 
223. 224 
BYTE 
216 217 


605 


я 


` 


Р /М-86 


134 


MODULE INFORMATION: 


CODE AREA SIZE 
CONSTANT AREA SIZE 
VARIABLE AREA 5125 
MAXIMUM STACK SIZE 
1211 LINES READ 


COMPILER 


006CH 


002AH 


0000H 


0052H 


ООЧЕН 


9004H 


9069H 


1 


TRUE 


USERINITSP 


USERSTACK 


VECTOR 


WORDMODE 


ОЕОВН 
00004 
2078Н 
0082H 


0 PROGRAM ERROR(S) 


END ОР PL/M-35 COMPILATION 


SDK36 SERIAL MONITOR 


40590 
00 
1200 
660 


WORD PARAMETER AUTOMATIC 


BYTE 
138 183 149 
LITERALLY 
20 88 101 
503 520 
LITERALLY 
632 
STRUCTURE AT 
228 231 233 
249 250 271 
STRUCTURE 
281 282 
WORD 
333 338 339 
WORD 
136 158 159 
58 59 60 
ВУТЕ 
323 


118 122 


234 
272 


238 


239 


BASED(INTVECTORPTR) 


343 


161 


336 


344 


359 


446 


241 


458 


244 


469 


PAGE 73 


381 


246 


.